如何设计索引/查询以避免在简单的 MySQL 查询中进行文件排序?
Posted
技术标签:
【中文标题】如何设计索引/查询以避免在简单的 MySQL 查询中进行文件排序?【英文标题】:How to design an index/query to avoid filesort in a simple MySQL query? 【发布时间】:2013-01-03 14:08:36 【问题描述】:我有一张表entrytable
,其中包含datum
、username
、status
、status_spam_user
、status_spam_system
和text
的列。
我想从具有username
、status
、status_spam_user
、status_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
的信息,因此必须单独进行排序(即文件排序)。是否可以以某种方式设计我的查询/索引,使其对WHERE
和ORDER BY
有用?
【问题讨论】:
请发布解释计划.. 【参考方案1】:在(user, status, datum)
上添加索引
由于 OR 条件,status_spam_user/status_spam_system 上的索引无法使用(它被使用到状态部分),并且必须使用索引的所有先前部分才能满足 order by part 索引
【讨论】:
以上是关于如何设计索引/查询以避免在简单的 MySQL 查询中进行文件排序?的主要内容,如果未能解决你的问题,请参考以下文章