1

我们有一个更新查询,它需要使用“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 列进行排序,但是:

  1. UPDATE 查询中不使用索引提示(根据 MySQL 文档)。

  2. 无论我如何创建索引(即
    使用所有三个查询的列(plugin_name_entry_id、plugin_name_form_id 和 id)或
    仅使用前 2 列),ORDER BY 子句似乎都忽略了索引。

  3. 并且无论我在 ORDER BY 子句中包含哪些列,查询总是忽略索引。

这个 ORDER 子句为每个查询增加了整整 1 秒,这是非常不可接受的。任何人都知道我如何使用索引按 ID 或其他解决方法排序?

4

1 回答 1

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)以使其有用。

希望这可以帮助。

于 2012-09-05T00:28:38.583 回答