Как ускорить COUNT запрос?

264
27 марта 2022, 16:10
$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

Answer 1

Вы так и не показали show create table таблиц, поэтому попробую угадать, что там внутри.

На плане запроса видно, что подходящих индексов нет (possible_keys = NULL). Пора добавить. На оба поля по которым идёт объединение: ".prefix."post_db.region и ".prefix."post_region.name.

Только не надо добавлять в индекс всю строку целиком! varchar(55) это зло. Попробуйте для начала 5-10 первых байт. Если строки по большей части одинаковые в начале, то найдите ту границу, откуда идёт заметная разница и пусть индекс будет длиной до этой границы + чуть-чуть.

Кажется, что регионы вы уже вынесли в отдельную таблицу. Т.е. нормализовали это дело. В этом случае и объединять лучше по числовым ключам. У вас же наверняка есть первичный ключ в таблице регионов.

Само объединение (даже если оставить его по текстовым полям) лучше вынести из подзапроса переписав всё на inner join .. group by.

READ ALSO
Проблема с переподключением к БД MySQL

Проблема с переподключением к БД MySQL

Проблема заключается в том, что при вызове db_add_country и db_read_country все отлично, но если после них вызвать poses, пишет такую ошибку

218
запрос на минимальное и максимальное значение

запрос на минимальное и максимальное значение

Всем приветЕсть 3 таблицы: field, posts, values

268
Как правильно организовать сайт со своим контентом для разных городов?

Как правильно организовать сайт со своим контентом для разных городов?

На dle cms пытаюсь организовать автоматическое определение города посетителя сайта

139
Круг = размеру JPanel

Круг = размеру JPanel

Рисую игруБоард 8*8 в нем кликаешь по одному из квадратиков (TileJPanel), в которых рисуется круг

85