我正在尝试避免使用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的任何建议吗?
答案 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
上创建一个索引,看看它是否有助于您的查询更快地运行。