Индексы MySQL не используются в большой базе данных - PullRequest
0 голосов
/ 14 мая 2018

У меня очень простой запрос к большой таблице (около 37 миллионов строк).Этот запрос выполняется более 10 минут и должен быть быстрым, поскольку индексы построены правильно (я думаю).Я не понимаю, почему этот запрос занимает так много времени.Я надеюсь, что кто-то может направить меня в правильном направлении:

Запрос:

select type_id, sub_type_id, max(settlement_date_time) as max_dt 
from transaction_history group by type_id, sub_type_id

Создать заявление:

 CREATE TABLE `transaction_history` (
 `transaction_history_id` int(11) NOT NULL AUTO_INCREMENT,
 `type_id` int(11) NOT NULL,
 `sub_type_id` int(11) DEFAULT NULL,     
 `settlement_date_time` datetime DEFAULT NULL,
 PRIMARY KEY (`transaction_history_id`),     
 KEY `sub_type_id_idx` (`sub_type_id_id`),
 KEY `settlement_date` (`settlement_date_time`),
 KEY `type_sub_type` (`type_id`,`sub_type_id`)
) ENGINE=InnoDB AUTO_INCREMENT=36832823 DEFAULT CHARSET=latin1;

Результат от Объяснить:

id -> 1
select_type -> SIMPLE
table -> transaction_history
type -> index
possible_keys -> NULL
key -> type_sub_type
key_len -> 9
ref -> NULL
rows -> 37025337
filtered -> 100.00
Extra -> 

Почему возможны ключи NULL?Он говорит, что использует индекс, но это не так.почему ссылка NULL?Как я могу сделать этот запрос более эффективным?Что-то не так с индексами?Нужно ли менять какие-либо значения в конфигурационном файле MySQL?

Спасибо

1 Ответ

0 голосов
/ 21 мая 2018

(извиняюсь перед двумя комментаторами, которые уже дали необходимое INDEX; я постараюсь сказать достаточно больше, чтобы оправдать предоставление «ответа».)

Используйте «составной» (и «покрытие»') index:

INDEX(type_id, sub_type_id, settlement_date_time)

Нет WHERE, поэтому не нужно беспокоиться о таких столбцах.Сначала идут столбцы в порядке, указанном в GROUP BY, затем идет другой столбец.Оптимизатор, вероятно, будет очень эффективно просматривать индекс.

Почему NULL?Ну, индекс с 2 столбцами бесполезен.В общем, если необходимо просмотреть более 20% таблицы, лучше просто отсканировать таблицу, а не отскок между индексом BTree и данными BTree.

Дополнительные советы: http://mysql.rjweb.org/doc.php/index_cookbook_mysql

...