SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 15.10.2018 03:34:20

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Подозрительно тормозит запрос

Приветствую друзья!
Имеется вот такая табличка в сокращенном виде (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"
 

Это баг какой то или фича?

Неактивен

 

#2 15.10.2018 11:48:03

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5516

Re: Подозрительно тормозит запрос

похоже на багу
а что показывает профайлинг запроса? на что тратится время?
попробуйте проверить табличку - REPAIR TABLE или myisamchk

Неактивен

 

#3 15.10.2018 13:48:46

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Re: Подозрительно тормозит запрос

Профайлинг говорит что "Sending data 33,997743s"
Всякие repair, optimize и analize я конечно же попробовал - не помогают. На такой же базе mysql 5.7 на другой машине - это запрос тормозит точно также.

Неактивен

 

#4 15.10.2018 14:04:23

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5516

Re: Подозрительно тормозит запрос

как временное решение:
выбирать только `numb`, а потом для найденных 25 `numb` вторым join вытащить id

но 5.7 умный - может упростить from подзапрос

а так похоже на багу

Неактивен

 

#5 15.10.2018 14:17:30

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Re: Подозрительно тормозит запрос

Да, и еще нюанс. Если из этой таблицы удалить партиции (

ALTER TABLE docs REMOVE PARTITIONING
), то внезапно запрос выполняется за тысячные доли секунды. Может такое определение партиций не корректное?

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson