Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Stored procedures T然后跑一会儿,然后重复_Stored Procedures_Mysql - Fatal编程技术网

Stored procedures T然后跑一会儿,然后重复

Stored procedures T然后跑一会儿,然后重复,stored-procedures,mysql,Stored Procedures,Mysql,这里有一些优秀的信息和工具 直流电 更新: 可能是由于网络问题导致超时,如果您使用的是本地mysql实例,则不太可能发生这种情况,或者是由于某个表被锁定太长时间而导致超时。锁定表太长时间的进程将作为慢速查询列在慢速日志中。您还可以让慢速日志查询显示任何未能使用索引导致查询效率低下的查询 如果可以在出现问题时使问题发生,则还可以使用phpmyadmin或命令行等工具运行“SHOW PROCESSLIST\G”,这将为您提供问题发生时正在运行的查询的列表 您认为问题出在insert语句中,因此锁定了

这里有一些优秀的信息和工具

直流电

更新:

可能是由于网络问题导致超时,如果您使用的是本地mysql实例,则不太可能发生这种情况,或者是由于某个表被锁定太长时间而导致超时。锁定表太长时间的进程将作为慢速查询列在慢速日志中。您还可以让慢速日志查询显示任何未能使用索引导致查询效率低下的查询

如果可以在出现问题时使问题发生,则还可以使用phpmyadmin或命令行等工具运行“SHOW PROCESSLIST\G”,这将为您提供问题发生时正在运行的查询的列表

您认为问题出在insert语句中,因此锁定了该表。因此,您需要找到锁定该表的内容,因此您需要找到运行速度如此之慢,以至于锁定该表的时间太长的内容。慢速查询是实现这一点的一种方法

其他要看的东西

CPU-它是空闲的还是满负荷运行

IO-IO是否导致阻塞

RAM-您是否一直在交换(会导致io过多)

表产品搜索查询是否使用索引

什么是主键

如果索引使用的字符串太长?您可能会构建一个巨大的索引文件,导致插入速度非常慢(缓慢的查询日志也会显示这一点)

是的,问题可能在别处,但你必须从某个地方开始,不是吗


DC

尝试用以下内容包装您的EXECUTE:

将会话事务隔离级别设置为“读取未提交”

使用@keywords、@keywords、@startOffset、@itemsToReturn执行选择

设置会话事务隔离级别可重复读取


我在TSQL中对所有报表存储过程和搜索执行了类似的操作,其中可重复读取对于减少数据库上运行的其他进程的锁定/阻塞问题并不重要。

感谢您的回答,它实际上运行速度并不慢。它似乎只是偶尔执行一次,我刚刚运行了它,它花费了0.0014s,所以实际速度没有问题?如果您搜索频繁出现的关键字,这将运行缓慢。比如说,如果您搜索关键字
'professional'
并且
1000000
产品包含此关键字,则引擎将需要检索所有这些记录,并根据您的排序顺序对其进行排序。通过创建一个复合索引,可以使用一个常用的谓词(不是全文)来改进这一点,但不幸的是,
MySQL
不允许在一个索引中混合全文键和非全文键。我知道,就我目前的目的而言,我认为总体速度不会有问题。谢谢<代码> @ Michael Baldry <代码>:如果速度将是一个问题,你可以考虑使用<代码>狮身人面像< /代码>为你的代码>全文> <代码>查询。它比MySQL的原生索引引擎要快得多。我试着推迟寻找答案,但没有效果。再说一次,除了超时之外,没有任何速度问题,当它以一个非常合理的速度工作时。是否有可能得到一个描述表来描述此表中使用的表?我想我们可以减少并发症,如果我在桌子上多看几眼的话,可能也可以加快。我支持凯文的评论。太少,无法继续。再一次,没有速度问题,除了超时,当它以非常合理的速度工作时。超时是由锁定引起的,而不是实际的速度问题。
    IF @resultsFound > 0 THEN
        INSERT INTO product_search_query (QueryText, CategoryId) VALUES (keywords, topLevelCategoryId);
    END IF;
DELIMITER $$

DROP PROCEDURE IF EXISTS `product_search` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `product_search`(keywords text, categories text, topLevelCategoryId int, sortOrder int, startOffset int, itemsToReturn int)
BEGIN

declare foundPos tinyint unsigned;
declare tmpTxt text;
declare delimLen tinyint unsigned;
declare element text;
declare resultingNum int unsigned;

drop temporary table if exists categoryIds;
create temporary table categoryIds
(
`CategoryId` int
) engine = memory;


set tmpTxt = categories;

set foundPos = instr(tmpTxt, ',');
while foundPos <> 0 do
set element = substring(tmpTxt, 1, foundPos-1);
set tmpTxt = substring(tmpTxt, foundPos+1);
set resultingNum = cast(trim(element) as unsigned);

insert into categoryIds (`CategoryId`) values (resultingNum);

set foundPos = instr(tmpTxt,',');
end while;

if tmpTxt <> '' then
insert into categoryIds (`CategoryId`) values (tmpTxt);
end if;

CASE
  WHEN sortOrder = 0 THEN
    SET @sortString = "ProductResult_Relevance DESC";
  WHEN sortOrder = 1 THEN
    SET @sortString = "ProductResult_Price ASC";
  WHEN sortOrder = 2 THEN
    SET @sortString = "ProductResult_Price DESC";
  WHEN sortOrder = 3 THEN
    SET @sortString = "ProductResult_StockStatus ASC";
END CASE;

SET @theSelect = CONCAT(CONCAT("
    SELECT SQL_CALC_FOUND_ROWS
      supplier.SupplierId as Supplier_SupplierId,
      supplier.Name as Supplier_Name,
      supplier.ImageName as Supplier_ImageName,

      product_result.ProductId as ProductResult_ProductId,
      product_result.SupplierId as ProductResult_SupplierId,
      product_result.Name as ProductResult_Name,
      product_result.Description as ProductResult_Description,
      product_result.ThumbnailUrl as ProductResult_ThumbnailUrl,
      product_result.Price as ProductResult_Price,
      product_result.DeliveryPrice as ProductResult_DeliveryPrice,
      product_result.StockStatus as ProductResult_StockStatus,
      product_result.TrackUrl as ProductResult_TrackUrl,
      product_result.LastUpdated as ProductResult_LastUpdated,

      MATCH(product_result.Name) AGAINST(?) AS ProductResult_Relevance
    FROM
      product_latest_state product_result
    JOIN
      supplier ON product_result.SupplierId = supplier.SupplierId
    JOIN
      category_product ON product_result.ProductId = category_product.ProductId
    WHERE
      MATCH(product_result.Name) AGAINST (?)
    AND
      category_product.CategoryId IN (select CategoryId from categoryIds)
    ORDER BY
      ", @sortString), "
    LIMIT ?, ?;
  ");

    set @keywords = keywords;
    set @startOffset = startOffset;
    set @itemsToReturn = itemsToReturn;

    PREPARE TheSelect FROM @theSelect;
    EXECUTE TheSelect USING @keywords, @keywords, @startOffset, @itemsToReturn;

    SET @resultsFound = FOUND_ROWS();

    SELECT @resultsFound as 'TotalResults';

    IF @resultsFound > 0 THEN
        INSERT INTO product_search_query (QueryText, CategoryId) VALUES (keywords, topLevelCategoryId);
    END IF;

END $$

DELIMITER ;
IF @resultsFound > 0 THEN
    INSERT DELAYED INTO product_search_query (QueryText, CategoryId) VALUES (keywords, topLevelCategoryId);
END IF;
CREATE TABLE t_lock (id INT NOT NULL PRIMARY KEY, val INT NOT NULL) ENGINE=InnoDB;
INSERT
INTO    t_lock
VALUES
        (1, 1),
        (2, 2);
-- Session 1
START TRANSACTION;
UPDATE  t_lock
SET     val = 3
WHERE   id IN (1, 2)

-- Session 2
START TRANSACTION;
INSERT
INTO    t_lock 
VALUES  (3, 3)
-- Success
-- Session 1
START TRANSACTION;
UPDATE  t_lock
SET     val = 3
WHERE   id BETWEEN 1 AND 2

-- Session 2
START TRANSACTION;
INSERT
INTO    t_lock 
VALUES  (3, 3)
-- Locks