#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. Я не думаю, что индекс — это правильный путь. Я бы запросил значения на средний уровень и произвольно выбрал там.