MySQL在内部查询中避免使用filesort

时间:2011-09-17 12:54:25

标签: mysql filesort

我正在尝试避免使用filesort但是没有从内部查询中删除它。如果我将条件移到外部查询,那么它什么都没有显示。

Create table articles (
   article_id Int UNSIGNED NOT NULL AUTO_INCREMENT,
   editor_id Int UNSIGNED NOT NULL,
   published_date Datetime,
Primary Key (book_id)) ENGINE = InnoDB;

Create Index published_date_INX ON articles (published_date);
Create Index editor_id_INX ON articles (editor_id);

EXPLAIN SELECT article_id, article_date FROM articles AA INNER JOIN 
    (
        SELECT article_id 
          FROM articles 
         WHERE editor_id=1 
         ORDER BY published_date DESC 
         LIMIT 100, 5
    ) ART USING (article_id);

+----+-------------+------------+--------+---------------+-----------+---------+----------------+--------+----------------+
| id | select_type | table      | type   | possible_keys | key       | key_len | ref            | rows   | Extra          |
+----+-------------+------------+--------+---------------+-----------+---------+----------------+--------+----------------+
|  1 |  | PRIMARY     | <derived2> | ALL    | NULL          | NULL      | NULL   NULL           |      5 |                | 
|  1 |  | PRIMARY     | AA         | eq_ref | PRIMARY       | PRIMARY   | 4      ART.article_id |      1 |                | 
|  2 |  | DERIVED     | articles   | ALL    | editor_id     | editor_id | 5                     | 114311 | Using filesort | 
+----+-------------+------------+--------+---------------+-----------+---------+----------------+--------+----------------+

3 rows in set (30.31 sec)

有关如何从此查询中删除filesort的任何建议吗?

1 个答案:

答案 0 :(得分:3)

也许您可以尝试在editor_id, published_date上添加索引。

create index edpub_INX on articles (editor_id, published_date);

关于你的内在疑问:

SELECT article_id 
  FROM articles 
 WHERE editor_id=1 
 ORDER BY published_date DESC 
 LIMIT 100, 5

MySQL的查询规划器可能认为按editor_id过滤(使用索引)然后按published_date排序比使用published_date_INX然后按editor_id过滤更好。查询计划器可能是正确的。

因此,如果您想对该特定查询“提供帮助”,请在editor_id, published_date上创建一个索引,看看它是否有助于您的查询更快地运行。