我有一个客户端,该客户端运行一个使用目录树方法的php图片库(在PHP 5.5,mysql 5.5上,使用myisam表)。不幸的是,他们的图库应用程序中的某些查询需要非常长的文件排序。令人讨厌的查询:
SELECT `name`, `slug`
FROM `db_table`
WHERE `left_ptr` <= '914731'
AND `right_ptr` >= '914734'
AND `id` <> 1
ORDER BY `left_ptr` ASC
在id,left_ptr和right_ptr上都有索引,但是根据EXPLAIN,在查询中都没有使用它们。
我听说(在“条件”列上)创建一个复合索引会使事情变得更快,但这是否适用于这种情况?最后一个条件实际上只是一个'1以外的子句',因此复合索引也适用于此吗?感谢您对此的任何见识。
答案 0 :(得分:2)
是的,(left_ptr, right_ptr)
上的复合索引应该可以使此查询更好地运行。
MySQL will only use one index per query。它可能不使用任何单个索引,因为它确定没有单个索引会比全表扫描快得多。例如,id <> 1
是除第一行以外的每一行,因此只需进行全表扫描。其他两个过滤器取决于数据的分布方式,但是如果它不过滤表的重要部分,则不会使用索引。
(left_ptr, right_ptr)
上的复合索引应使此查询更好地运行。不必担心id
,因为id <> 1
只会过滤一行。
MySQL可以单独使用组合索引的第一列,因此该组合索引也可以单独替换left_ptr
上的索引