Использование индексов в mysql для группировки (group by)
Написать этот пост меня побудил разговор с одним из представителей mail.ru, который утверждал, что наличие индексов никогда и никак не влияет на выполнение процедуры группировки (GROUP BY) и что индексы нужны только для фильтрации и сортировки.
Я же с этим утверждением никак не мог согласиться и решил написать небольшой пример использования индекса при группировке.
Создал в базе простую InnoDB таблицу:
CREATE TABLE `test` (
`id` INTEGER(11) NOT NULL AUTO_INCREMENT,
`x` INTEGER(11) UNSIGNED NOT NULL DEFAULT ‘0′,
`y` BIGINT(20) UNSIGNED NOT NULL DEFAULT ‘0′,
PRIMARY KEY (`id`)
)ENGINE=InnoDB
AUTO_INCREMENT=1 CHARACTER SET ‘utf8′ COLLATE ‘utf8_general_ci’
COMMENT=”
Заполнил ее случайными цифрами и выполнил простой запрос:
explain select
y, count(*)
from
`test`
Where
x = 0
group by y
Результатом выполнения которого стал вот такой план:
id: 1
select_type: SIMPLE
table: test
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 762498
Extra: Using where; Using temporary; Using filesort
Видно, что сначала сработало условие Where x = 0, затем для группировки данные перекочевали во временную таблицу в памяти (если конечно памяти хватило. в противном случае временная таблица - это myISAM на диске), а затем были отсортированы.
Теперь создаем index по полю y и снова выполняем запрос:
id: 1
select_type: SIMPLE
table: test
type: index
possible_keys: NULL
key: y
key_len: 8
ref: NULL
rows: 762498
Extra: Using where
Из результатов видно, что сервер использует индекс по полю y и успешно работает с ним без использования временных таблиц.
Теперь пробуем вариант с составным индексом по x и y (назовем его 2xy):
id: 1
select_type: SIMPLE
table: test
type: ref
possible_keys: 2xy
key: 2xy
key_len: 4
ref: const
rows: 381249
Extra: Using where; Using index
Ну и напоследок пример с клиническим случаем, когда утверждается, что индекс для группировки не нужен - создаем индекс только по полю x:
id: 1
select_type: SIMPLE
table: test
type: ref
possible_keys: x
key: x
key_len: 4
ref: const
rows: 381249
Extra: Using where; Using temporary; Using filesort
Видно, что единственный индекс x успешно используется, но при этом для группировки снова привлекаются временные таблицы и filesort.
Если Вам понравилась заметка, пожалуйста, прокомментируйте ее или подпишитесь на фид и получайте будущие публикации по RSS.

Комментарии
// Begin Comments & Trackbacks ?>Пока нет комментариев.
Прокомментировать