【问题标题】:Removing 'using filesort' from query从查询中删除“使用文件排序”
【发布时间】:2011-12-02 11:52:32
【问题描述】:

我有以下疑问:

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

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

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

最后,这里是索引(同样,不是我做的!):

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

这是 EXPLAIN 的输出:

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

【问题讨论】:

  • 为什么需要在简单选择中给表起别名
  • 我没有,这个查询是更大查询的一部分,我没有删除别名。如果它让你更快乐,我现在就删除它:-)
  • 大概有多少行(25?200 万?)可能将 deleted_flag 设置为 0?

标签: mysql sql query-optimization filesort


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    mysql 文档说

    索引不会用于 order by 子句 if

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

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

    http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html 我想这里的情况也是如此。虽然你可以尝试使用 Force Index

    【讨论】:

    • 我看到了,但不确定如何处理这些新知识。我尝试过使用强制索引,但不确定要在哪个索引上使用它或要创建什么索引。
    • 我不太确定,但根据文档,索引 (delete_flag, spot date) 可能会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 2013-01-27
    • 2014-09-22
    • 2014-02-13
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多