MySQL выбрать с помощью файловой сортировки, индекс не используется
Извините за длинный пост, но это действительно странно, и я близок к тому, чтобы отказаться от него. 2 таблицы:
CREATE TABLE `endu_results` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`base_name` varchar(200) NOT NULL,
`base_nr` int(11) DEFAULT NULL,
`base_yob` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `endu_results_206a6355` (`base_name`),
KEY `endu_results_63df4402` (`base_nr`),
KEY `base_yob` (`base_yob`)
) ENGINE=InnoDB AUTO_INCREMENT=3424028 DEFAULT CHARSET=utf8;enter code here
и 2-й:
CREATE TABLE `endu_resultinterest` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`result_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `endu_resultinterest_3b529087` (`result_id`),
CONSTRAINT `result_id_refs_id_19e24435` FOREIGN KEY (`result_id`) REFERENCES `endu_results` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=48590 DEFAULT CHARSET=utf8;
В endu_resultstable содержится около 2 миллионов записей и меньше, чем 100K. У меня медленный запрос:
explain select base_yob from endu_resultinterest
inner join endu_results
on (endu_results.id = endu_resultinterest.result_id)
order by endu_results.base_yob;
1 SIMPLE endu_resultinterest index endu_resultinterest_3b529087 endu_resultinterest_3b529087 4 NULL 47559 Using index; Using temporary; Using filesort
Вопрос в том, почему mysql использует этот индекс: endu_resultinterest_3b529087 - но он должен использовать base_yob - именно здесь запрашивается сортировка?
Чтобы проверить это дальше, я вручную создал 2 дополнительные идентичные таблицы endu_testresults и endu_testresultintrest и заполнил их некоторыми записями:
CREATE TABLE `endu_testresults` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`base_yob` int(11) DEFAULT NULL,
`base_name` varchar(200) NOT NULL,
`base_nr` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `endu_testresults_a65b2616` (`base_yob`),
KEY `endu_testresults_ba0ab39c` (`base_name`),
KEY `endu_testresults_d75ba04d` (`base_nr`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8;
Итак, я иду снова для объяснения:
explain select base_yob from endu_testresultinterest
inner join endu_testresults
on (endu_testresults.id = endu_testresultinterest.result_id)
order by endu_testresults.base_yob;
и сюрприз сюрприз
1 SIMPLE endu_testresults index PRIMARY endu_testresults_a65b2616 5 NULL 19 Using index
Столбец сортировки индекса base_yob (endu_testresults_a65b2616) теперь используется.
Почему в одном случае используется индекс, а в другом - использование файловой сортировки, временное использование? Размер имеет значение? Я постараюсь копировать записи из одной в другую, но не получаю это с индексами. MySql 5.6.16
1 ответ
Краткий ответ: потому что это быстрее.
Длинный ответ...
Ваши ОБЪЯСНЕНИЯ кажутся неполными - я ожидал бы 2 строки в каждой.
Первый стол в 20 (70?) Раз больше, чем второй. Для начала оптимизатор выбрал меньшую таблицу. Следовательно, изначально выполняется 1/20 объема работы. Вид, который приходит позже (ORDER BY ...
) гораздо меньше работы, чем если бы для начала пришлось выполнить в 20 раз больше работы.
Выход только 48K строк, правильно? И это сколько строк во 2-й таблице, верно?
Ваш test
у таблиц не было такого же большего / меньшего соотношения, не так ли? Отсюда и разные EXPLAIN
,