Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL排序依据:选择和更新的不同解释 请考虑一个带有 QuealEngEng/、优先级和 MeasaGeD时间戳< /代码>栏> 表。_Mysql_Sql_Relational Database_Sql Order By_Mariadb - Fatal编程技术网

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);