避免 mysql 文件排序

Avoiding mysql filesort

我有一个客户 运行 一个 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,其中 none 个正在查询中使用。

我听说创建复合索引(在 'condition' 列上)会使事情变得更快,但这是否适用于这种情况?最后一个条件实际上只是一个 'anything but 1' 子句,那么复合索引也适用于它吗?感谢您对此的任何见解。

是的,(left_ptr, right_ptr) 上的复合索引应该会使此查询 运行 更好。

MySQL will only use one index per query。它可能不使用任何单个索引,因为它确定没有单个索引会比完整 table 扫描快得多。例如,id <> 1 是除第一行以外的每一行,因此只需进行完整的 table 扫描。其他两个过滤器取决于数据的分布方式,但如果它没有过滤很大一部分 table,它就不会使用索引。

(left_ptr, right_ptr) 上的复合索引应该使此查询 运行 更好。不要理会 id,因为上面的 id <> 1 只过滤一行。

MySQL可以单独使用复合索引的第一列,所以这个复合索引也单独替代了left_ptr上的那个