請考慮一個表queue_name
,priority
和message_timestamp
列。MySQL的ORDER BY:不同的EXPLAIN的SELECT和UPDATE
這裏是一個複合索引:
CREATE INDEX STATE_QUEUENAME_PRIORITY_TIMESTAMP ON
`queue_messages` (queue_name, state, priority, message_timestamp);
解釋SELECT:(!用相同WHERE
和ORDER 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
?
你可以嘗試給一個索引提示https://dev.mysql.com/doc/refman/5.7/en/index-hints.html – RiggsFolly
我不知道肯定,但你正在更新狀態,這是屬於關鍵所以也許你不能。 –
這是唯一的索引嗎? –