У меня есть несколько таблиц с ~ 10 миллионами строк. Время выполнения этого запроса составляет около ~ 10 минут:Оптимизация Mysql в одном запросе
SELECT
c.id,
CONCAT_WS(', ', country.name, region.name, c.name) AS [text]
FROM city_name AS cn
INNER JOIN city AS c
ON c.id = cn.city_id
INNER JOIN country
ON country.id = cn.country_id
INNER JOIN region
ON region.id = cn.region_id
WHERE cn.name LIKE '%:q%'
GROUP BY cn.city_id
LIMIT 50
Но когда я делаю два запросов его казни около 5 секунд:
Первый:
SELECT
city_id
FROM city_name
WHERE name LIKE '%:q%'
GROUP BY city_id
LIMIT 50
Вторая:
SELECT
c.id,
CONCAT_WS(', ',country.name,region.name,c.name) AS text
FROM city AS c
INNER JOIN country
ON country.id = c.country_id
INNER JOIN region
ON region.id = region_id
WHERE c.id IN (:ids)
Как я могу оптимизировать его в одном запросе?
Спасибо.
Вы проверили план объяснения – khalid
Вы используете 'LIKE = '% .....%'', который не может использовать какой-либо индекс (поскольку индексы строк не индексируют всю строку, а скорее подмножество). Не зная цели этого столбца, я не могу дать никакой точной рекомендации, но в целом попытаюсь переписать его как 'LIKE = '...%'' (префикс). – apokryfos
В отсутствие каких-либо агрегационных функций предложение GROUP BY довольно бессмысленно. Аналогично, предложение LIMIT без предложения ORDER BY. – Strawberry