$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.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей