Почему mysql запрос не использует индекс - PullRequest
0 голосов
/ 31 марта 2020

В MySQL 5.xxx я выполнил запрос ниже, и он показал, что индекс не использовался, хотя был возможный ключ.

explain
select * from OPER_MEMB_AAAB
where AAA between '2020/01/01' and '2020/03/22'
order by AAA;

enter image description here

А вот моя структура таблицы.

create table OPER_MEMB_AAAB
(BAG varchar(16) ,
BBJ varchar(4) ,
AAA datetime ,
AAB int ,
AAC smallint ,
AAD int comment ,
AAE smallint ,
AAF datetime )
create unique index IDX_OPER_MEMB_AAAB_U on OPER_MEMB_AAAB(AAA,BAG,BBJ,AAC);
create index IDX_OPER_MEMB_AAAB_1 on OPER_MEMB_AAAB(AAF);

AAA - это столбец даты и времени и первый столбец уникального индекса. Почему Mysql не использовал уникальный индекс, хотя знал, что может его использовать? В этой таблице 4 миллиона записей и 2,8 миллиона различных значений AAA.

1 Ответ

0 голосов
/ 01 апреля 2020

Оптимизатор просматривает индексы, но может вернуться к простому сканированию таблицы. Если индекс выборочный, он будет использовать индекс; в противном случае, вероятно, будет быстрее сканировать таблицу, избегая, таким образом, подпрыгивания между BTree индекса и BTree данных.

Отсечка варьируется, но удобное правило большого пальца составляет 20%. 2.8M / 4M - это больше, чем 20%, поэтому он решил отсканировать таблицу. Сократите диапазон дат, вы увидите переключение объяснения на использование индекса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...