MySQL排序依据:选择和更新的不同解释 请考虑一个带有 QuealEngEng/、优先级和 MeasaGeD时间戳< /代码>栏> 表。
以下是一个复合索引:MySQL排序依据:选择和更新的不同解释 请考虑一个带有 QuealEngEng/、优先级和 MeasaGeD时间戳< /代码>栏> 表。,mysql,sql,relational-database,sql-order-by,mariadb,Mysql,Sql,Relational Database,Sql Order By,Mariadb,以下是一个复合索引: CREATE INDEX STATE_QUEUENAME_PRIORITY_TIMESTAMP ON `queue_messages` (queue_name, state, priority, message_timestamp); 解释选择: EXPLAIN SELECT message_timestamp from queue_messages WHERE queue_name = 'folder'
CREATE INDEX STATE_QUEUENAME_PRIORITY_TIMESTAMP ON
`queue_messages` (queue_name, state, priority, message_timestamp);
解释选择:
EXPLAIN SELECT message_timestamp
from queue_messages
WHERE queue_name = 'folder'
AND state = 0
ORDER BY priority DESC, message_timestamp DESC
LIMIT 1;
使用where返回;使用索引
解释更新(使用相同的WHERE
和ORDER BY
!):
使用where返回;使用文件排序
--
它会对性能产生重大影响(对50k行进行20ms选择,而90ms更新)
如何强制MariaDB(MySQL)在UPDATE语句中删除
filesort
CREATE INDEX STATE_QUEUENAME_TIMESTAMP_2 ON `queue_messages` (queue_name, state, priority, message_timestamp);
您现有的索引不包括
优先级
,因此它不能用于排序依据
您可以尝试给出一个索引提示,我不确定,但您正在更新作为密钥一部分的状态,所以您可能无法。Craigyong还有复合PK(队列名称、消息id)的自动索引。我为order by而烦恼,因为我需要使用sort by given只更新前N行columns@silent-盒子好。我错过了结尾处的限制。我不知道为什么mysql会以不同的方式规划查询。然而,我建议你最好在任何情况下通过PK键控你的更新。这不应该受到你正在经历的问题的影响。但更重要的是,您当前的方法可能存在潜在的bug,因为update语句不是确定性的。它不会始终影响预定的消息,但每次执行时都会根据当前数据确定要更新的消息。这在多用户系统中更难解释。历史上,SELECT
和UPDATE
的处理方式不同。最近在处理方面有一些变化;你正在运行哪个版本?同时,请向bugs.mysql.com或mariadb.com提交错误报告。(或者如果您同时测试了两者)非常抱歉,我不小心复制粘贴了错误的索引声明。你是对的,我已经对所有4个字段使用了索引。用正确的索引更新了问题:STATE\u QUEUENAME\u PRIORITY\u TIMESTAMP
事实上,这就是为什么我想知道-SELECT查询与索引完全匹配,但用完全相同的WHERE/ORDER子句更新-不是。
CREATE INDEX STATE_QUEUENAME_TIMESTAMP_2 ON `queue_messages` (queue_name, state, priority, message_timestamp);