Странное поведение MySQL в Windows (100% ЦП с простым запросом)

Мы запускаем MySQL 8 на сервере Windows 2019 (Dell R420, 32 ядра, 64 ГБ, твердотельные накопители на Raid10). Время от времени наш веб-сайт полностью отключается, так как ЦП на сервере MySQL полностью заблокирован (ЦП 100%).

После небольшого исследования мы обнаружили, что эти запросы накапливаются и требуют бесконечно долго, чтобы вернуть результаты :

SELECT count(id)
FROM g3hy2_usergroups

Это очень простой запрос. Он просто возвращает количество групп пользователей в этой таблице. Это таблица InnoDB, размер которой составляет всего 80 КБ.

Когда мы запускаем этот запрос вручную, он занимает 0,037 секунды. чтобы вернуть результаты, но после того, как мы запустим его (например) в 40-й раз, мы обнаруживаем «ошибку», и требуется вечно , чтобы возвращать результаты (на самом деле она выполняется вечно, я подозреваю, пока не попадет в Тайм-аут MySQL).

Я не знаю, ошибка ли это MySQL и / или что-то не так с нашей базой данных или что-то еще, о чем мы не можем подумать. е.

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

Между прочим, это не проблема оборудования, так как мы пробовали разные серверы с одинаковыми результатами.

Спасибо Alex

1
задан 17 November 2020 в 12:11
1 ответ

Некоторые составные индексы, которые, возможно, помогут:

g3hy2_social_stream_item: INDEX(target_id, context_type, d.created)
g3hy2_social_stream_item: INDEX(target_id, created)
g3hy2_social_stream_item: INDEX(verb, context_type, created, context_id)
g3hy2_content:  INDEX(cat_id, id)

Это кажется бесполезным; избавься если сможешь:

JOIN  g3hy2_jreviews_content as jc  ON c.id = jc.content

Попробуй переместить это в производную таблицу с UNION:

    GROUP BY  p.listing_id
    ORDER BY  p.created DESC
    LIMIT  20;

То есть попробуй сделать LIMIT до Присоединение к c и jc. Это должно снизить стоимость этих соединений.

Если вы успешно справились с вышеуказанной задачей, переместите эти 3 строки в каждую SELECT из UNION. См. http://mysql.rjweb.org/doc.php/index_cookbook_mysql#or

О стойле на 40 копиях... Это может быть, что у вас 40 копий этого запроса работают одновременно, и они спотыкаются друг о друга - делят 32 ядра. Мои комментарии выше надеются, что запрос будет выполняться достаточно быстро, чтобы предотвратить нагромождение на автостраде.

(EXPLAIN может помочь в анализе.)

1
ответ дан 18 November 2020 в 20:13

Теги

Похожие вопросы