MySQL 5.1, использующий событие сортировки файлов при наличии индекса - PullRequest
6 голосов
/ 24 мая 2011

Возможно, мне не хватает какой-то глупости ... Очевидно, MySQL 5.1 продолжает выполнять сортировку файлов, даже если существует индекс, который точно соответствует столбцу в предложении ORDER BY. Чтобы опубликовать это здесь, я упростил модель данных, но проблема все еще происходит:

Определение таблицы:

CREATE TABLE `event` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `owner_id` int(11) DEFAULT NULL,
  `date_created` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `owner_id` (`owner_id`),
  KEY `date_created` (`date_created`),
  CONSTRAINT `event_ibfk_1` FOREIGN KEY (`owner_id`) REFERENCES `user_profile` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

Моя проблема в том, что событие, отображаемое простым SELECT "Использование сортировки файлов":

explain select * from event order by date_created desc;

И результат для запроса объясните:

id  select_type table   type    possible_keys   key key_len ref rows    Extra   
1   SIMPLE      event   ALL NULL        NULL    NULL    NULL    6       Using filesort

Можно ли для запросов такого типа использовать индекс вместо выполнения сортировки файлов?

Спасибо всем заранее.

Ответы [ 2 ]

3 голосов
/ 24 мая 2011

Поскольку ваш оператор CREATE TABLE указывает, что у вас менее 10 строк (AUTO_INCREMENT=7) и использование FORCE INDEX в моей установке заставит MySQL использовать индекс, я полагаю, оптимизатор считает, что сканирование таблицы происходит быстрее (меньше случайных операций ввода / вывода), чем сканирование индекса (поскольку вы выбираете все столбцы, а не только date_created).Это подтверждается следующим:

mysql> explain select date_created from event order by date_created;
+----+-------------+-------+-------+---------------+--------------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key          | key_len | ref  | rows | Extra       |
+----+-------------+-------+-------+---------------+--------------+---------+------+------+-------------+
|  1 | SIMPLE      | event | index | NULL          | date_created | 9       | NULL |    1 | Using index |
+----+-------------+-------+-------+---------------+--------------+---------+------+------+-------------+
1 row in set (0.00 sec)

В указанном выше случае сканирование индекса происходит быстрее, поскольку требуется возвращать только индексированный столбец.

В документации MySQL есть некоторые случаи, когда использованиеиндекс считается медленнее: http://dev.mysql.com/doc/refman/5.1/en/how-to-avoid-table-scan.html

0 голосов
/ 24 мая 2011

Q: Можно ли для запросов этого типа использовать индекс вместо сортировки файлов?

A: Чтобы MySQL использовал индекс, если это вообще возможно, попробуйте:

EXPLAIN SELECT * FROM event FORCE INDEX (date_created) ORDER BY date_created DESC;

Использование FORCE INDEX (index_name) говорит MySQL о необходимости использования индекса, если это вообще возможно.В отсутствие этой директивы MySQL выберет наиболее эффективный способ возврата набора результатов.Сортировка файлов может быть более эффективной, чем использование индекса.

...