$res_region = db_query ("
SELECT ".prefix."post_region.*,
(
SELECT COUNT(*)
FROM ".prefix."post_db
WHERE ".prefix."post_db.region = ".prefix."post_region.name
) AS CountReviews
FROM ".prefix."post_region
WHERE name != ''
ORDER by name ASC
");
Подскажите как можно ускорить запрос, генерация страницы занимает 34 секунды. В базе 700 тысяч записей.
Версия MySQL: 5.5.62
Вы так и не показали show create table таблиц, поэтому попробую угадать, что там внутри.
На плане запроса видно, что подходящих индексов нет (possible_keys = NULL). Пора добавить. На оба поля по которым идёт объединение: ".prefix."post_db.region и ".prefix."post_region.name.
Только не надо добавлять в индекс всю строку целиком! varchar(55) это зло. Попробуйте для начала 5-10 первых байт. Если строки по большей части одинаковые в начале, то найдите ту границу, откуда идёт заметная разница и пусть индекс будет длиной до этой границы + чуть-чуть.
Кажется, что регионы вы уже вынесли в отдельную таблицу. Т.е. нормализовали это дело. В этом случае и объединять лучше по числовым ключам. У вас же наверняка есть первичный ключ в таблице регионов.
Само объединение (даже если оставить его по текстовым полям) лучше вынести из подзапроса переписав всё на inner join .. group by.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости