繁体   English   中英

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

[英]Mysql: order by two column, use filesort

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

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 文章 ALL NULL NULL NULL NULL 437168 使用 where; 使用文件排序

我为(选项、删除、日期添加、类别 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

仅在何处使用

我尝试将索引添加到(选项、删除、日期添加、类别 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 并且,不保证最终排序会在外部查询中出现,但它在实践中确实有效(并且由于物化而接近保证)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM