我们有一个更新查询需要使用“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列进行排序,但是:
在UPDATE查询中不使用索引提示(根据MySQL文档)。
无论我如何创建索引,ORDER BY子句似乎都会忽略索引(即
使用所有三个查询列(plugin_name_entry_id,plugin_name_form_id和id)或
只是前两列。
并且无论我在ORDER BY子句中包含哪些列,查询总是如此 忽略索引。
此ORDER子句为每个查询添加一整秒,这是非常不可接受的。任何人都知道我如何使用索引按ID排序,或其他一些解决方法?
答案 0 :(得分:0)
简要介绍一下复合索引;首先要考虑的是查询数据的方式。如果你有一个复合键,例如(col1, col2)
,并且你试图查询SELECT * FROM tbl WHERE col2 = 5
,则不会使用索引,因为你需要SELECT
左边的所有键。
使用UPDATE
时,唯一一次使用索引的是WHERE
子句(可能还有ORDER BY
)。考虑到上述信息,您需要确保使用索引的最左侧列(plugin_name_form_id
)。如果您具有(col1, plugin_name_form_id)
的组合键,则该更新语句将不会使用该索引。您也可以颠倒索引(plugin_name_form_id, col1)
的顺序,使其有用。
希望这有帮助。