我有以下查询:
SELECT *
FROM shop_user_member_spots
WHERE delete_flag = 0
ORDER BY date_spotted desc
LIMIT 10
运行时需要几分钟。该表大约有250万行。
这是表格(不是由我设计的,但我可以进行一些更改):
最后,这里是索引(再次,不是我做的!):
我一直试图让这个查询快速运行几个小时,但无济于事。
以下是EXPLAIN的输出:
非常感谢任何帮助/文章。
答案 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工作)。