Mysql:按两列排序,使用文件排序

标签 mysql filesort mysql-slow-query-log

我在订购两列时遇到问题。

EXPLAIN SELECT * FROM articles WHERE option <>0 AND deleted=0 ORDER BY
    date_added DESC, category_id DESC LIMIT 25 OFFSET 500

id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE articles ALL NULL NULL NULL NULL 437168 Using where; Using filesort

我为(option、deleted、date_added、category_id)添加单个索引

当我使用:

EXPLAIN SELECT * FROM articles WHERE option <>0 AND deleted=0 ORDER BY
    date_added DESC LIMIT 25 OFFSET 500

EXPLAIN SELECT * FROM articles WHERE option <>0 AND deleted=0 ORDER BY
    category_id DESC LIMIT 25 OFFSET 500

只在什么地方使用

我尝试将索引添加到 (option, deleted, date_added, category_id) 但它仅在我尝试按一列排序时有效。

最佳答案

要让 MySQL 为这个查询使用索引将非常困难:

SELECT *
FROM articles
WHERE option <> 0 AND deleted = 0
ORDER BY date_added DESC
LIMIT 25 OFFSET 500

你可以试试复合索引:articles(deleted, date_added, option) .通过覆盖 WHEREORDER BY , MySQL 可能 使用它。

如果你可以添加一个optionflag等式测试列(而不是 <> ),然后将查询写为:

SELECT *
FROM articles
WHERE optionflag = 1 AND deleted = 0
ORDER BY date_added DESC
LIMIT 25 OFFSET 500;

然后是 articles(deleted, optionflag, date_added desc) 上的索引会很好用。

否则子查询可能适合您:

SELECT a.*
FROM (SELECT *
      FROM articles
      WHERE deleted = 0
      ORDER BY date_added DESC
     ) a
WHERE option <> 0
LIMIT 25 OFFSET 500;

这实现了中间结果,但它正在执行 order by反正。并且,不能保证在外部查询中显示最终顺序,但它在实践中确实有效(并且由于具体化而接近保证)。

关于Mysql:按两列排序,使用文件排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32845145/

相关文章:

php - 从远程服务器更新 mysql localhost 数据库

mysql - 查询以替换表中的空值

mysql - 使用 filesort 按 MySQL 中的日期时间列排序

MySQL - 将 5.5.27 升级到 5.7 时出现性能问题

Mysql:制作数据库的备份副本

MySQL - 我可以查询某些行或列占用了多少磁盘空间吗?

mysql - 使用 LEFT JOIN 和 ORDER BY...LIMIT 查询速度慢,使用 Filesort

mysql - 尝试隔离每个主机的 pt-query-digest

mysql:慢查询日志: sleep (60)?