请考虑一个表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
我不知道肯定,但你正在更新状态,这是属于关键所以也许你不能。 –
这是唯一的索引吗? –