Медленный запрос при использовании DISTINCT в MYSQL с различными другими условиями (10 миллионов записей) - PullRequest
0 голосов
/ 03 июня 2018

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

Это запрос, который в настоящее время используется из таблицы действий

SELECT DISTINCT `activities`.`post_id` 
FROM `activities` 
WHERE (activities.user_id IN ([followed_user_ids]) AND 
activities.language_id IN ([language_ids]) AND 
activities.id <= ?) AND 
(`activities`.`post_user_id` NOT IN ([blocked_and_deactivated_user_ids])) 
ORDER BY `activities`.`id` DESC 
LIMIT 1 OFFSET 10

Это запрос, который вызывает проблемы.Иногда загрузка процессора Mysql достигает 100%, что вызывает проблемы у пользователей.Я также использовал индекс для столбцов, используемых в таблице действий.

В таблице действий есть 10 миллионов записей.

Какие изменения я могу сделать, чтобы оптимизировать это?

1 Ответ

0 голосов
/ 08 июня 2018

Прежде всего, для рабочей БД на RDS я бы предложил создать Read Replica и перенаправить все эти тяжелые запросы SELECT на реплику.Вот ссылка на документы .Делая это, вы уменьшите проблему замораживания для ваших пользователей, поскольку тяжелые запросы не будут выполняться в том же экземпляре, что и обычная рабочая нагрузка.

Во-вторых, рассмотрите возможность создания индексов для таблиц, связанных с этими тяжелыми запросами.,Чтобы правильно выбрать, какие индексы создавать, используйте оператор EXPLAIN и проверьте основные узкие места, т. Е. Где в запросе выполняется больше шагов для получения правильных данных.

Если вы действительно не можете избавитьсяиз этих операторов IN (я думаю, что, по крайней мере, некоторые из них, которые вы должны иметь, например идентификаторы и языки следующих пользователей, возможно, вы можете заменить IN простыми объединениями, используя идентификатор пользователя), создают индексы для соответствующих столбцов.

Дайте нам знать, как это происходит.

...