через mysqladmin ext -i 1 -c 30 можно получить 30 раз запущенный SHOW GLOBAL STATUS. этот вывод обработать bash скриптом
pt-mext -r -- cat status.txt
в полученном файле - первый столбец название переменной статуса, второй - количество с последнего рестарта, третий и далее изменение за секунду.
в Handler_% сидит статистика по движку хранения (innodb скорее всего только у вас), описание по этим переменным тут
https://dev.mysql.com/doc/refman/8.0/en/server-status-variables.html#statvar_Handler_read_rnd_nextИ дальше надо смотреть: если read_rnd_next почти нет и read_key по количество не в сотни тысяч раз меньше чем read_prev+read_next и order by/group by мало/нет, то индексами много не сделаешь (rnd_next это полное сканирование таблички, read_key это чтение первой записи из индекса, read_next/prev это сканирование индекса). Если мы уже 1-10к строчек всегда берём из базы и сканируем только их, значит индексы уже хорошие.
Обычно на одно ядро CPU в вакууме InnoDB может прокачивать от 1М до 4М строчек (вызовов Handler) в секунду. Handler_write часто меньше - 100к-1М. Это приблизительные наблюдения для нормальных average row length (100b-4KB)
Sort_rows, Sort_scan, Sort_range, Sort_merge_passes если много, то надо посмотреть запросы с order by group by на предмет нужных индексов.
На ревью 3-5 самых тяжёлых запросов обычно уходит неделя. Результат, в зависимости от запущенности может дать снижение нагрузки в 3-10 раз. Настолько крутые сервера даже купить сложно.
Если программисты не могут отказаться от тяжёлых запросов (сканирование всей таблицы и всякая аналитика), то такие запросы можно унести на реплику (второй сервер, только для чтения).
Трафик сетевой на сервере низкий, селектов не так много, я бы поставил на то, что 1-2 тяжёлых селекта делают всю нагрузку на CPU. Тем более что нулевое Innodb_data_reads в секунду (если я правильно понимаю ваши графики), говорит о достаточном размере buffer pool. К сожалению, я не знаю: 94% это процент использования CPU по всем ядрам или только по одному (может быть больше 100%?). Каждый запрос в MySQL может использовать не более одного ядра процессора, и если select работает 30 секунд, одно ядро процессора будет загружено на 100% в течении 30 секунд.