如何设计索引/查询以避免在简单的 MySQL 查询中进行文件排序?

Posted

技术标签:

【中文标题】如何设计索引/查询以避免在简单的 MySQL 查询中进行文件排序?【英文标题】:How to design an index/query to avoid filesort in a simple MySQL query? 【发布时间】:2013-01-03 14:08:36 【问题描述】:

我有一张表entrytable,其中包含datumusernamestatusstatus_spam_userstatus_spam_systemtext 的列。

我想从具有usernamestatusstatus_spam_userstatus_spam_system 特定值的行中选择列文本的内容。由于这可能会导致一长串条目(> 30'000),我想限制匹配行的数量。在此之前,匹配的行应按列datum 排序。

SELECT text
FROM entrytable
WHERE user = 'username' &&
`status` = '1' && (
    `status_spam_user` = 'no_spam'
    || (
        `status_spam_user` = 'neutral' &&
        `status_spam_system` = 'neutral'
    )
)
ORDER BY datum DESC
LIMIT 6430 , 10

我在表中添加了两个索引:

index_datum(基准) index_status_mit_spam(用户、状态、status_spam_user、status_spam_system)

对于此查询,使用索引index_status_mit_spam。由于索引不包含列datum 的信息,因此必须单独进行排序(即文件排序)。是否可以以某种方式设计我的查询/索引,使其对WHEREORDER BY 有用?

【问题讨论】:

请发布解释计划.. 【参考方案1】:

(user, status, datum) 上添加索引 由于 OR 条件,status_spam_user/status_spam_system 上的索引无法使用(它被使用到状态部分),并且必须使用索引的所有先前部分才能满足 order by part 索引

【讨论】:

以上是关于如何设计索引/查询以避免在简单的 MySQL 查询中进行文件排序?的主要内容,如果未能解决你的问题,请参考以下文章

提高mysql数据库查询效率

mysql提高查询速度

mysql如何避免回表查询

如何让mysql速度更快的响应?如何提高读取和查询速度

MySQL M题1 MySQL常见优化

mysql 存储及查询亿级数据