Приветствую друзья!
Имеется вот такая табличка в сокращенном виде (mysql 5.7, 5Gb, 11 млн строк):
CREATE TABLE `docs` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`numb` INT(11) NULL DEFAULT NULL,
`is_delete` TINYINT(4) NOT NULL DEFAULT '0',
`is_draft` TINYINT(4) NOT NULL DEFAULT '0'
PRIMARY KEY (`id`, `is_draft`, `is_delete`),
UNIQUE INDEX `ux_numb` (`numb`, `is_draft`, `is_delete`)
)
/*!50100 PARTITION BY LIST (is_draft*10+is_delete)
(PARTITION main VALUES IN (0) ENGINE = MyISAM,
PARTITION drafts VALUES IN (10) ENGINE = MyISAM,
PARTITION dels VALUES IN (1) ENGINE = MyISAM,
PARTITION dels_drafts VALUES IN (11) ENGINE = MyISAM) */;
И есть к ней вот такой запрос:
SELECT
`id`,
`numb`
FROM `docs`
WHERE numb >= 38248393 AND numb <= 38248400
ORDER BY numb DESC
LIMIT 25
Этот запрос выполняется более 30 секунд. И я не могу понять почему, ведь выборка идет по уникальному ключу.
Если из данного запроса выкинуть из SELECT поле `id`, или убрать ORDER BY или во WHERE numb не диапазон а точное соответствие (например WHERE numb = 38248393) - то запрос выполняется за 0,00... секунды.
На быстро поставленной на соседнем сервере MariaDB на копии этой же базы запрос выполняется 0,016 секунды.
Явно mysql в таком сочетании условий делает fullscan зачем то. Explain не показывает ничего криминального:
"id" "select_type" "table" "partitions" "type" "possible_keys" "key" "key_len" "ref" "rows" "filtered" "Extra"
"1" "SIMPLE" "docs" "main,drafts,dels,dels_drafts" "range" "ux_numb" "ux_numb" "5" "7" "2,62" "Using index condition; Using where"
Это баг какой то или фича?