Настройка SQL для улучшения времени повторной обработки сервера

#mysql #pagespeed #server-response

#mysql #скорость страницы #сервер-ответ

Вопрос:

Мой SQL-скрипт сканирует ~ 7000 записей и извлекает 100 из них случайным образом, а также извлекает соответствующие данные из дополнительной таблицы (через SQL JOIN). При использовании этого кода время отклика моего сервера чрезвычайно низкое (> 7 секунд).

   ROUND(AVG(r.rank),0)  AS avrank,
  COUNT(r.rank) AS countrank
  FROM stories s 
  LEFT JOIN ratings 
  AS r 
  ON r.storyidr = s.id 
  GROUP BY s.id 
  ORDER BY RAND() 
  LIMIT 100";
  

Мне было интересно, может ли кто-нибудь дать рекомендацию о том, что я мог бы сделать, чтобы улучшить время отклика и увеличить скорость страницы. Заранее благодарю.

Ответ №1:

Вы должны запустить EXPLAIN PLAN для этого запроса. Я предполагаю, что все эти случайные операции заставляют вас сканировать каждую строку. Как могло быть иначе?

Если вы видите СКАНИРОВАНИЕ ТАБЛИЦЫ, вам придется либо переписать запрос, чтобы исключить сканирование страниц.

Индексы — ваш друг.

Я бы рекомендовал создать ПРЕДСТАВЛЕНИЕ для всех строк в СОЕДИНЕНИИ.

7000 записей — это небольшое число. Я бы выполнил запрос по всем данным просмотра и извлек случайную выборку на стороне сервера.

Комментарии:

1. спасибо @duffymo, это хорошее место для начала. Запутался в том, как настроить индекс для обработки рандомизированной функции. Может быть, в отношениях между двумя таблицами?

2. Я не думаю, что индекс — это правильный путь. Я бы запросил значения на средний уровень и произвольно выбрал там.