Оптимизация большого запроса MySQL

70
9

Сегодня мой хостинг-провайдер сообщил, что моя база данных должна быть немедленно заблокирована. У меня есть запрос, который вызывает огромную нагрузку на сервер. Вы знаете, как я могу оптимизировать свой запрос, чтобы сделать сервер менее загруженным?

SELECT 'users'.'id',
'why_me',
'created',
'thumbnail',
'rating_date',
CONCAT(first_name, ' ', last_name) AS name,
SUBSTRING(why_me, 1, 27) as subwhy,
COUNT('rating_date') AS total,
MAX('rating_date') AS maxrate
FROM ('user_profiles')
LEFT OUTER JOIN 'rates' ON 'user_profiles'.'id'='rates'.'user_id'
JOIN 'users' ON 'user_profiles'.'user_id'='users'.'id'
WHERE 'users'.'activated' = '1'
AND 'last_name' != ""
AND 'first_name' != ""
AND concat_ws(' ', first_name, last_name) COLLATE UTF8_GENERAL_CI LIKE '%%'
GROUP BY 'user_profiles'.'user_id'
ORDER BY 'total' desc

Буду признателен за любую помощь от вас. Благодарю!

спросил(а) 2013-05-31T12:19:00+04:00 7 лет, 3 месяца назад
1
Решение
57

AND  concat_ws(' ', first_name, last_name) COLLATE UTF8_GENERAL_CI  LIKE '%%'

не имеет никакого эффекта, но стоит дорого (долго работает). Он сканирует все строки один за другим, не возвращая ничего полезного. Удалить!

Войдите в phpmyadmin и запустите этот запрос с добавлением " EXPLAIN ", то есть "EXPLAIN SELECT users...". Отправьте результат. Он покажет нам, может ли SQL напрямую обращаться к требуемым строкам или искать их один за другим. Следите за клавишей, используемой строкой: если она пуста, вам нужно добавить indecioanl indeces:

1) Убедитесь, что у вас есть индекс для каждого столбца, используемого для объединений, то есть rate.user_idand user_profiles.user_id.

2) Убедитесь, что у вас есть пробелы во всем, что используется для части с высокой мощностью, то есть first_name и last_name.

3) Еще лучше: создать индекс по 3 столбцам: активирован, first_name, last_name

4) GROUP и ORDER BY вызывают сборку временной таблицы. Можете ли вы перенести часть этой логики в PHP?

5) Получите результат. Это не нужно делать в реальном времени!

ответил(а) 2013-05-31T12:29:00+04:00 7 лет, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема