可以在MySQL中使用复合索引对更新查询进行排序吗?
我们有一个更新查询,需要使用“order by”子句来确保更新正确的行,如下所示:可以在MySQL中使用复合索引对更新查询进行排序吗?,mysql,sql-update,indexing,Mysql,Sql Update,Indexing,我们有一个更新查询,需要使用“order by”子句来确保更新正确的行,如下所示: UPDATE `plugin_name_codes` USE|FORCE INDEX abc SET `plugin_name_entry_id` = 2 WHERE `plugin_name_codes`.`plugin_name_form_id` = 3 AND (plugin_name_entry_id IS NULL) ORDER BY /*plugin_name_form_id asc, plugin
UPDATE `plugin_name_codes`
USE|FORCE INDEX abc
SET `plugin_name_entry_id` = 2
WHERE `plugin_name_codes`.`plugin_name_form_id` = 3
AND (plugin_name_entry_id IS NULL)
ORDER BY /*plugin_name_form_id asc, plugin_name_entry_id asc,*/ id ASC
LIMIT 1
我们希望使用索引对ID列进行排序,但是:
使用所有三个查询列(plugin\u name\u entry\u id、plugin\u name\u form\u id和id),或
只有前两列
此子句在每个查询中加了整整1秒,这是非常不可接受的。有人知道我如何使用索引来排序ID,或者其他一些解决方案?
简单地在复合索引上;首先要考虑的是查询数据的方式。如果你有一个复合键,比如<代码>(COL1,COL2)。如果您尝试从tbl查询SELECT*,其中col2=5
,则不会使用索引,因为您需要首先从左侧选择所有键
使用UPDATE
,索引只会与WHERE
子句(可能还有orderby
)一起使用。考虑到上述信息,您需要确保索引的最左边一列正在使用(plugin\u name\u form\u id
)(col1,plugin\u name\u form\u id)
,该update语句不会使用索引。您还可以颠倒索引的顺序(plugin\u name\u form\u id,col1)
,使其有用
希望这能有所帮助。您在一个事务中不使用两个查询的原因是什么?是的,我们需要使用的更新最终会阻塞数据库很长一段时间(出于某些原因):-/I的意思是对ID进行选择,然后通过ID进行更新。如果我要使用选择,那么我必须使用“选择…进行更新”,这将暂时阻止…但我将尝试并报告。如果您执行“正常”选择,只是为了尝试排序混乱:那里的性能差异是什么?