我正在尝试简化查询以弄清楚为什么它在生产服务器上这么慢。这个想法是抓住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
但我还没想出如何使用表连接将其用于更大的查询。我错过了一些非常简单的东西吗?
答案 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有关?无论如何,感谢我在插上电话时的尝试帮助!