@ArtiomK

Как оптимизировать и ускаорить данный запрос к базе данных MySQL Zabbix?

Я создаю веб приложение вокруг базы данных Zabbix (MySQL), я хотел бы оптимизировать и ускорить следующий запрос:

```
SELECT distinct(hosts.hostid), max(CONVERT(CONCAT(events.eventid, events.value, events.severity), UNSIGNED))
FROM hosts
INNER JOIN hosts_groups ON hosts.hostid = hosts_groups.hostid
INNER JOIN hstgrp ON hosts_groups.groupid = hstgrp.groupid

INNER JOIN items ON hosts.hostid = items.hostid
INNER JOIN functions ON items.itemid = functions.itemid
INNER JOIN events ON functions.triggerid = events.objectid
WHERE events.name = %s
AND hstgrp.groupid = %s
AND hosts.status != 3 # 3 - not templates
GROUP BY hosts.hostid;
```

Я делаю 7 таких запросов внутри одного запроса http GET к веб приложению на основе Flask. Общее время этих 7 запросов варьируется от 10 до 70 секунд, что я связываю с тем, что таблица events постоянно меняется. Таблица events содержит большое кол-во записей.

Результаты Explain:

5f9461157e0a1667997771.png

Как можно ускорить данный запрос?

Сейчас я добавляю Redis для хранения результатов этих запросов в течение 5 минут, далее наверно добавлю Celery, чтобы убрать такие долгие по времени запросы из http сервера. Но это о ускорении приложения в целом.
  • Вопрос задан
  • 99 просмотров
Решения вопроса 2
2ord
@2ord
продвинутый чайник
2-я строка в EXPLAIN говорит, что СУБД должна пройтись по всем 958 тыс. записей для того, чтобы выбрать из них нужные по условию where. Насколько я понимаю, WHERE events.name = %s.
Предлагаю производить выборку не по полю name, а по тому, у которого есть индекс. Или создать индекс по name и другим полям, по которым производится поиск..

Также можно использовать партицирование таблицы events.

Если и этого не хватит, то из-за тяжелых запросов к СУБД имеет смысл создать дополнительную таблицу, которую обновлять планировщиком задач. Она будет представлять из себя материализованное представление, оптимизированное для обращений веб-приложения.
Ответ написан
@ArtiomK Автор вопроса
Для того чтобы получить список текущих проблем и недавно завершеных проблем существует отдельная таблица problem
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы