[英]mysql query execution time | reduce query
我有一个查询,可以更改用户顺序。
这是我的查询:
update test set orderID =
case orderID
when (select orderID from ( select * from test where orderID > ( select orderID from test where id = 'id I want to move up' ) limit 1) as nextOrderID ) then ( select orderID from ( select * from test where id = 'id I want to move up') as nextOrderID )
when ( select orderID from ( select * from test where id = 'id I want to move up' ) as nextOrderID ) then (select orderID from ( select * from test where orderID > ( select orderID from test where id = 'id I want to move up' ) limit 1) as nextOrderID )
else
orderID
end
我想知道执行该查询是否会花费很多时间,如果执行该查询,将如何使其加载更快,并且是否有可能减少该查询?
更新:
我编辑了一些代码,所以现在我认为它将更快地执行查询..这是代码的一部分:
$query = "
SELECT (
SELECT orderID
FROM test WHERE id = 'user id that i want to move up'
) AS user_order,
(
SELECT orderID
FROM test WHERE orderID > user_order
ORDER BY orderID
LIMIT 0,1
) AS nextUser_order
";
$result = mysql_query($query);
$data = mysql_fetch_assoc($result);
$query = "
UPDATE test SET orderID = IF(orderID='{$data[nextUser_order]}',
'{$data[user_order]}', '{$data[nextUser_order]}')
WHERE orderID IN ('{$data[nextUser_order]}', '{$data[user_order]}');
";
$result = mysql_query($query);
我想知道执行该查询是否会花费很多时间,
er ...您是说要知道查询是否需要很多时间才能执行? 当然比它需要的还多-但是在很大程度上取决于数据库的结构,数据库中的数据以及您对“大量时间”的定义。
该查询是一团糟。 除了查询的不必要的复杂性之外,这也是错误的-您使用LIMIT来检索列表中的下一个条目,而没有定义该列表应如何排序。
似乎应该更改列表的顺序。 (假设orderID是唯一的)会更明智:
DELIMITER $$
CREATE PROCEDURE bubble_up(IN p_selected INTEGER)
BEGIN
DECLARE l_selected_seq INTEGER;
DECLARE l_replaced_seq INTEGER;
SELECT orderID into l_selected_seq
FROM test
WHERE id=p_selected;
IF (l_selected>1) THEN
SELECT orderID INTO l_replaced_seq
WHERE orderID>l_selected_seq
ORDER BY orderID
LIMIT 0,1;
-- swap the values
UPDATE test SET orderID = IF(orderID=l_replaced_seq,
l_selected_seq, l_replaced_seq)
WHERE orderID IN (l_replaced_seq, l_selected_seq);
END IF
END$$
查询逻辑是否有点过多? 我会用一些代码来实现结果...
如果由于某种原因被迫执行复杂的mysql查询,您可以发布表的desc吗? 为了确保我拥有必要的索引,我首先尝试对选择进行解释...
我看到了一些问题,但是我认为最大的问题是您正在更新所有表,而我实际上只需要更新特定的行。 您应该在UPDATE语句中添加WHERE子句,以防止锁定(和更新)不需要更新的行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.