【发布时间】:2012-03-11 10:21:37
【问题描述】:
我正在尝试简化查询以找出为什么它在生产服务器上如此缓慢。这个想法是抓取 X 个最新条目进行分页。问题是,MySQL 的优化器似乎想要使用文件排序而不是主键 (ID)。使用索引(主要)去除所有无关的东西,以下工作按需要进行:
EXPLAIN SELECT ID FROM table ORDER BY ID DESC
但是,这些变体求助于文件排序:
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
但我还没有弄清楚如何通过表连接将其用于更大的查询。我错过了一些非常简单的东西吗?
【问题讨论】:
-
强制使用索引会加快查询速度吗?如果您需要读取表的所有记录(就像您所做的那样),那么使用索引可能没有意义。 “这个想法是抓取 X 个最近的条目进行分页”。然后在某处应该有 LIMIT 子句。否则数据库认为你想要它们。
-
抱歉,我没有提到 LIMIT 子句,因为这是我为上述示例删除的部分内容。设置 LIMIT 似乎没有任何效果——它仍然每次都使用文件排序。我没有让它在生产服务器上使用 FORCE INDEX 运行速度测试;仅通过 EXPLAIN 测试。
标签: mysql indexing sql-order-by optimization