Почему MySQL использует сортировку файлов в этом случае? - PullRequest
5 голосов
/ 22 мая 2011

Структура таблицы:

CREATE TABLE IF NOT EXISTS `newsletters` 
(
    `id` int(11) NOT NULL auto_increment,
    `last_update` int(11) default NULL,
    `status` int(11) default '0',
    `message_id` varchar(255) default NULL,
    PRIMARY KEY  (`id`),
    KEY `status` (`status`),
    KEY `message_id` (`message_id`),
    KEY `last_update` (`last_update`)
) 
ENGINE=MyISAM DEFAULT CHARSET=latin1;

Запрос:

SELECT id, last_update
FROM newsletters
WHERE status = 1
ORDER BY last_update DESC 
LIMIT 0, 100
  • newsletters таблица имеет более 3 миллиона записей
  • запрос занимает 26 секунд для выполнения

Объяснение запроса:

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  newsletters range   status  status  5   NULL    3043354 Using where; Using filesort

Так почему он не использует filesort, и как это range запрос?

1 Ответ

5 голосов
/ 22 мая 2011

Используется filesort для сортировки по last_update.Вы можете избежать сортировки файлов, изменив индекс на status, last_update, поэтому MySQL находит все строки со статусом 1 в правильном порядке.

Для дальнейшей оптимизации измените индекс на status, last_update, id.Это позволяет MySQL удовлетворить запрос, просто посмотрев на индекс, без поиска в таблице.

CREATE INDEX idx_newsletters_status
ON newsletters(status, last_update, id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...