2015-08-24 2 views
0

я застрял с FileSort на мой запросMySQL - избежать FileSort

EXPLAIN SELECT o.job_offerid 
FROM job_offer AS o 
WHERE o.status = 1 
ORDER BY o.sequence ASC, o.active_updated_when DESC, o.created DESC 
LIMIT 10; 

Этот запрос использует правильный индекс, но стил использует FileSort. Выход из EXPLAIN:

select_type: SIMPLE 
table: o 
type: ref 
possible_keys: status,status_sequence_active_updated_when_created 
key: status_sequence_active_updated_when_created 
key_len: 4 
ref: const 
rows: 15153 
Extra: Using where; Using filesort 

Тип столбцов:

статус INT (13), последовательность INT (13), active_updated_when (DateTime), созданный (DateTime)

Таблица MyISAM, MySQL версии 5.6.21

Я пытаюсь найти похожие вопросы о stackoverflow, но безуспешно.

Спасибо

Редактировать (добавить структуру таблицы без других столбцов):

CREATE TABLE `job_offer` (
    `job_offerid` int(13) NOT NULL AUTO_INCREMENT, 
    `sequence` int(13) NOT NULL DEFAULT '0', 
    `created` datetime NOT NULL, 
    `status` int(13) NOT NULL DEFAULT '1', 
    `active_updated_when` datetime DEFAULT NULL, 
    PRIMARY KEY (`job_offerid`), 
    KEY `status` (`status`), 
    KEY `sequence` (`sequence`), 
    KEY `created` (`created`), 
    KEY `active_updated_when` (`active_updated_when`), 
    KEY `status_sequence_active_updated_when_created` (`status`,`sequence`,`active_updated_when`, `created`), 
    FULLTEXT KEY `name` (`name`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 
+0

Любые причины, по которым вы хотите избежать filesort? – rlanvin

+0

Кроме того, предоставьте инструкцию create table с структурой индекса. – rlanvin

+0

Это потому, что запрос медленный - 0,1 секунды –

ответ

2

Вы не можете избежать FileSort в этом случае.

Почему? Because of this:

В некоторых случаях MySQL не может использовать индексы для разрешения ORDER BY

[...]

Вы смешиваете ASC и DESC

Best вы можете сделайте это, если вы хотите полностью избежать filesort, чтобы переосмыслить ваш пункт ORDER BY. Действительно ли необходимо иметь все эти 3 поля? Можете ли вы реорганизовать свою таблицу, чтобы использовать меньше полей для сортировки? В качестве альтернативы, вы можете изменить значение одного поля, чтобы использовать только DESC (или только ASC) для всех?

+0

Yeap, вот и все ... Спасибо, я попытаюсь выяснить другой способ загрузки этих данных. –

Смежные вопросы