从查询中删除“使用filesort”

时间:2011-12-02 11:52:32

标签: mysql sql query-optimization filesort

我有以下查询:

SELECT    *
FROM      shop_user_member_spots
WHERE     delete_flag = 0
ORDER BY  date_spotted desc
LIMIT     10

运行时需要几分钟。该表大约有250万行。

这是表格(不是由我设计的,但我可以进行一些更改):

database table

最后,这里是索引(再次,不是我做的!): indexes

我一直试图让这个查询快速运行几个小时,但无济于事。

以下是EXPLAIN的输出: explain output

非常感谢任何帮助/文章。

2 个答案:

答案 0 :(得分:0)

我在解释计划中看到的问题是没有使用发现日期的索引,正在使用insted filesort机制进行排序(就删除标志的索引而言,我们实际上获得了索引的性能优势如果正在创建索引的列包含唯一值)

mysql文档说

如果

,索引不会用于order by子句
  

用于获取行的键与ORDER BY中使用的键不同:

     

SELECT * FROM t1 WHERE key2 = constant ORDER BY key1;

http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html 我想这里也是如此。虽然您可以尝试使用强制索引

答案 1 :(得分:0)

根据您的查询,您希望的索引似乎在(delete_flag, date_spotted)上。您有一个包含两列的索引,但id列位于它们之间,这会使索引在基于date_spotted的排序中失败。现在mysql是否会使用基于Zohaib答案的索引我不能说(对不起,我经常使用SQL Server工作)。