У меня есть сервер mariadb 10.3 и следующая таблица (с использованием механизма хранения InnoDB):
create table if not exists token (
`token` bigint unsigned not null,
`uid` smallint unsigned not null default 0,
`nham` int default 0,
`nspam` int default 0,
`timestamp` int unsigned default 0
) Engine=InnoDB;
create index token_idx1 on token(token);
create index token_idx2 on token(uid);
В таблице токенов ~ 900 тыс. строк, и я хотел бы выполнить следующий запрос с 2-300 числами в предложении IN ( )
:
select token, nham, nspam from token where token in (1,2,3,4,...);
Теперь проблема: запрос выполняется очень медленно, и он просто не будет использовать token_idx1
:
+------+-------------+-------+------+---------------+------------+---------+-------+--------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +------+-------------+-------+------+---------------+------------+---------+-------+--------+-------------+ | 1 | SIMPLE | token | ref | token_idx1 | token_idx1 | 2 | const | 837534 | Using where | +------+-------------+-------+------+---------------+------------+---------+-------+--------+-------------+
Поскольку столбец токена проиндексирован, я удивлен, что объяснение выбора говорит, что оптимизатор не интересуется token_idx1
(и запрос занимает много времени, ~ 30 секунд из-за полного сканирования таблицы).
Как решить проблему? Я знаю, что я мог бы использовать USE INDEX(token_idx1)
в запросе, но я бы решил это без такого взлома.
key_len = 2
, аtoken
— этоBIGINT UNSIGNED
(8 байт). Пожалуйста, проверьтеCREATE TABLE
, индексы и объяснение. - person Rick James   schedule 20.07.2018PRIMARY KEY
на столе. - person Rick James   schedule 20.07.2018