2

我无法订购两列。

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

我为 (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) 但它仅在我尝试按一列排序时才有效。

4

1 回答 1

1

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

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

您可以尝试复合索引:articles(deleted, date_added, option). 通过覆盖WHEREand ORDER 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无论如何它都在做。而且,最终的排序不能保证在外部查询中出现,但它在实践中确实有效(并且由于物化而接近保证)。

于 2015-09-29T13:57:04.383 回答