MySQL избегает сортировки файлов во внутреннем запросе - PullRequest
1 голос
/ 17 сентября 2011

Я пытаюсь избежать сортировки файлов, но не получаю удачу в удалении его из внутреннего запроса. Если я перенесу условие во внешний запрос, то оно ничего не показывает.

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)

Есть предложения, как удалить сортировку файлов из этого запроса?

1 Ответ

3 голосов
/ 17 сентября 2011

Может быть, вы можете попробовать добавить индекс для 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 и посмотрите, поможет ли он выполнить ваш запрос быстрее.

...