2011-09-17 7 views
1

私はファイルを避けようとしていますが、内側のクエリからファイルを取り除くことはできません。条件を外部クエリに移動すると、何も表示されません。MySQLは内側の問い合わせで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を削除する方法を教えてください。

答えて

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にインデックスを作成し、クエリがより速く実行されるようにするかどうかを確認してください。

+0

'edpub_INX'インデックスはおそらく役に立たないでしょう** MySQL ** ** **公開された日付の' 'published_date''はB + TREEインデックスのため、順序は重要です。インデックスキーは' 'editor_id''、' '公開された日付。 'order by'節を助けるために、私はクエリプランナーが' published_date'が最初のフィールドであるインデックスを必要とすると思います。 –

関連する問題