SELECT journey.code, journey.departure, journey.end, group_concat(pattern_road.latitude)
FROM journey
INNER JOIN journey_day ON journey_day.journey = journey.code
INNER JOIN pattern ON pattern.code = journey.pattern
LEFT JOIN pattern_road ON pattern_road.section = pattern.section
WHERE journey_day.day = 5 AND TIME(NOW()) BETWEEN journey.departure AND journey.end
GROUP BY journey.code
Вышеприведенный запрос занимает примерно 100 мс для выполнения. Я доволен этим, но теперь мне нужно добавить еще одно соединение, когда я пытаюсь сделать это, запрос замедляется примерно до 2 секунд.
Это новый медленный запрос с дополнительным соединением:
SELECT journey.code, journey.departure, journey.end, group_concat(pattern_road.latitude) AS road, group_concat(link.stop) AS stop
FROM journey
INNER JOIN journey_day ON journey_day.journey = journey.code
INNER JOIN pattern ON pattern.code = journey.pattern
LEFT JOIN pattern_road ON pattern_road.section = pattern.section
INNER JOIN link ON link.section = pattern.section
WHERE journey_day.day = 5 AND TIME(NOW()) BETWEEN journey.departure AND journey.end
GROUP BY journey.code
Примечания:
Дополнительное соединение также работает в том же столбце, что и предыдущее соединение (pattern_road), я могу только думать, что это должно быть причиной проблемы. Например, если я заменю соединение pattern_road с соединением ссылок, запрос вернется к 100 мс, я просто не могу использовать оба соединения и запустить его с частотой 100 мс.
Схема базы данных/индексы в SQL Fiddle
Любые идеи, почему это происходит? Спасибо заранее.
Помните, что два индекса в двух столбцах не совпадают с одним составным индексом на двух столбцах. Запрос может использовать только один индекс для таблицы *.
Добавьте индекс на pattern(code, section)
или pattern(section, code)
(для определения того, какой из них обеспечивает лучший результат, требуется живой тест с фактическими данными).
* за исключением очень редких случаев
Вы можете попробовать это?
SELECT SQL_NO_CACHE journey.code, journey.departure, journey.end,
(select group_concat(pattern_road.latitude) from pattern_road where pattern_road.section = pattern.section) AS road,
(select group_concat(link.stop) from link where link.section = pattern.section) AS stop
FROM journey
INNER JOIN journey_day ON journey_day.journey = journey.code
INNER JOIN pattern ON pattern.code = journey.pattern
WHERE journey_day.day = 5 AND TIME(NOW()) BETWEEN journey.departure AND journey.end
GROUP BY journey.code
left join pattern_road
но сослались на него в select
в ответе, если я добавлю, что оно работает отлично :)