簡體   English   中英

mysql查詢執行時間 減少查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM