可以在MySQL中使用复合索引对更新查询进行排序吗?

可以在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

我们有一个更新查询,需要使用“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_name_entry_id asc,*/ id ASC
LIMIT 1
我们希望使用索引对ID列进行排序,但是:

  • 在更新查询中不使用索引提示(根据MySQL文档)

  • 无论我如何创建索引,ORDER BY子句似乎都会忽略索引(即
    使用所有三个查询列(plugin\u name\u entry\u id、plugin\u name\u form\u id和id),或
    只有前两列

  • 无论我在ORDERBY子句中包含哪些列,查询总是 忽略索引


  • 此子句在每个查询中加了整整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进行更新。如果我要使用选择,那么我必须使用“选择…进行更新”,这将暂时阻止…但我将尝试并报告。如果您执行“正常”选择,只是为了尝试排序混乱:那里的性能差异是什么?