>我有一个客户端运行一个使用目录树方法的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以外的任何东西"条款,那么综合指数是否也适用于此?感谢您对此的任何见解。
是的,(left_ptr, right_ptr)
上的复合索引应该使此查询运行得更好。
MySQL每个查询只会使用一个索引。它可能没有使用任何单个索引,因为它确定没有单个索引会比全表扫描快得多。例如,id <> 1
是除第一行之外的每一行,因此只需执行全表扫描即可。其他两个筛选器取决于数据的分布方式,但如果它不筛选表的重要部分,则不会使用索引。
(left_ptr, right_ptr)
上的复合索引应使此查询运行得更好。不要打扰id
,如上所述id <> 1
只过滤一行。
MySQL 可以单独使用复合索引的第一列,因此此复合索引也单独替换了left_ptr