MySQL добавление соединения замедляет весь запрос

0
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

Любые идеи, почему это происходит? Спасибо заранее.

  • 0
    вам нужно проиндексировать ссылку на раздел столбца
  • 0
    @Jasen У меня уже есть этот индекс. Я связал SQL Fiddle в вопросе, чтобы вы могли видеть существующие индексы и структуру таблицы.
Показать ещё 2 комментария
Теги:
join
innodb

2 ответа

0

Помните, что два индекса в двух столбцах не совпадают с одним составным индексом на двух столбцах. Запрос может использовать только один индекс для таблицы *.

Добавьте индекс на pattern(code, section) или pattern(section, code) (для определения того, какой из них обеспечивает лучший результат, требуется живой тест с фактическими данными).


* за исключением очень редких случаев

0

Вы можете попробовать это?

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            
  • 0
    Намного лучше!! Спасибо. Это уменьшает запрос до 100 мс. Просто для справки, в запросе вы пропустили left join pattern_road но сослались на него в select в ответе, если я добавлю, что оно работает отлично :)
  • 0
    О, 1 момент, может быть, вам не нужно ничего добавлять ... просто нужно проверить запрос еще раз
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню