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

标签 mysql indexing query-optimization filesort

我有一个表entrytable,其中包含列datum用户名status status_spam_userstatus_spam_systemtext

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

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 有用?

最佳答案

(用户、状态、数据)上添加索引 由于 OR 条件,无法使用 status_spam_user/status_spam_system 上的索引(已使用到状态部分),并且必须使用索引的所有先前部分才能满足 order by 部分的索引

关于mysql - 如何设计索引/查询以避免简单 MySQL 查询中的文件排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14140504/

相关文章:

mysql - 在 MySQL 结果集中搜索

indexing - 使用键值数据库作为具有持久索引的集合

sql - 如何使用索引加速当前查询

SQL Server View 优化帮助(重复子查询、case when 等等...)

postgresql - PostgreSQL 中的优化查询

mysql - 如何让所有艺术家都没有视频和照片?

mysql - 如何从给定的数据文件在 MySQL 中创建表

Mysql tinyint 转时间戳

java - 从 Arraylist 中获取 float 而不是对象

mysql - 尽管有索引,但带有 GROUP BY 查询的 DISTINCT COUNT 速度太慢