2011-09-17 3 views
1

filesort를 피하려고하지만 내부 쿼리에서 파일을 제거하지 않으려 고합니다. 조건을 외부 쿼리로 이동하면 아무 것도 표시되지 않습니다.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' 인덱스는 B + TREE 인덱스 이후로 ** published ** date **에 ** ** ** ** ** ** 정렬하는 데 도움이되지 않을 것입니다. 순서는 중요하며 인덱스 키는 : editor_id', published_date'를 입력하십시오. 'order by' 절을 돕기 위해 쿼리 플래너에는'published_date '가 첫 번째 필드 인 인덱스가 필요하다고 생각합니다. –