当SELECT中存在多个字段时,mysql ORDER BY未使用索引

时间:2012-02-21 03:52:37

标签: mysql indexing sql-order-by optimization

我正在尝试简化查询以弄清楚为什么它在生产服务器上这么慢。这个想法是抓住X最近的分页条目。问题是,MySQL的优化器似乎想要使用filesort而不是主键(ID)。剥离所有无关的东西,以下工作根据需要,使用索引(主要):

EXPLAIN SELECT ID FROM table ORDER BY ID DESC

然而,这些变化依赖于filesort:

EXPLAIN SELECT ID, field2 FROM table ORDER BY ID DESC
EXPLAIN SELECT * FROM table ORDER BY ID DESC

我需要返回几个字段,因此不起作用...我可以在简化查询中解决问题:

EXPLAIN SELECT * FROM table FORCE INDEX (Primary) ORDER BY ID DESC

但我还没想出如何使用表连接将其用于更大的查询。我错过了一些非常简单的东西吗?

2 个答案:

答案 0 :(得分:0)

尝试此查询

select * from table order by id desc limit (pageNO-1) * noEntries , noEntries

例如,每页第1页和10个条目

 select * from table order by id desc limit 0, 10

例如,第2页和每页10个条目

select * from table order by id desc limit 10, 10

答案 1 :(得分:0)

问题解决了!我经历了很多修改,不能发誓哪一个是关键,但我认为主要的是运行OPTIMIZE TABLE,它具有以下清理效果:

Type        Usage
Data        241.2 KiB -> 239.4
Index       31,744 B  -> 26,624
Overhead    136 B     -> 0
Effective   272.0 KiB
Total       272.2 KiB -> 265.4

有了这个,我能够运行“EXPLAIN SELECT ID,field2 FROM table ORDER BY ID DESC LIMIT 0,10”,而不是诉诸于filesort,所以这是一个好的开始。从那里开始,我再次开始构建主查询,并遇到了DISTINCT(ID)的问题,使其无法使用主键作为索引。但是,它需要存在,因为ID字段连接的其中一个表具有每个ID的多个条目。但是,用GROUP BY ID替换DISTINCT(ID)就可以了。这在以前没有用,所以我想知道它是否与OPTIMIZE TABLE有关?无论如何,感谢我在插上电话时的尝试帮助!