2017-05-14 26 views
0

請考慮一個表queue_name,prioritymessage_timestamp列。MySQL的ORDER BY:不同的EXPLAIN的SELECT和UPDATE

這裏是一個複合索引:

CREATE INDEX STATE_QUEUENAME_PRIORITY_TIMESTAMP ON 
     `queue_messages` (queue_name, state, priority, message_timestamp); 

解釋SELECT:(!用相同WHEREORDER BY

EXPLAIN SELECT message_timestamp 
     from queue_messages 
     WHERE queue_name = 'folder' 
      AND state = 0 
     ORDER BY priority DESC, message_timestamp DESC 
       LIMIT 1; 

返回Using where; Using index

解釋UPDATE:

EXPLAIN UPDATE queue_messages 
     SET  state = 1 
     WHERE queue_name = 'folder' 
      AND state = 0 
     ORDER BY priority DESC, message_timestamp DESC 
       LIMIT 1; 

返回Using where; Using filesort

-

它會導致顯著的性能影響(20ms的選擇VS 90毫秒UPDATE上50,000列)。

如何強制MariaDB(MySQL)在UPDATE語句中刪除filesort

+0

你可以嘗試給一個索引提示https://dev.mysql.com/doc/refman/5.7/en/index-hints.html – RiggsFolly

+0

我不知道肯定,但你正在更新狀態,這是屬於關鍵所以也許你不能。 –

+0

這是唯一的索引嗎? –

回答

0

update,你需要第二個指標:

CREATE INDEX STATE_QUEUENAME_TIMESTAMP_2 ON `queue_messages` (queue_name, state, priority, message_timestamp); 

您現有的指數不包括priority,所以它不能用於order by

+0

我很抱歉,我認爲複製粘貼錯誤的索引聲明。你是對的,我已經使用了所有4個領域的索引。使用正確的索引更新了問題:'STATE_QUEUENAME_PRIORITY_TIMESTAMP' –

+0

其實這就是爲什麼我想知道 - SELECT查詢完美匹配索引,但更新與完全相同的WHERE/ORDER子句 - 不是。 –