Сколько времени должен занимать такой запрос MySQL?

Дано:
Сервер MySQL 5.6.34, база данных InnoDB ~250Gb с учетом индексов, около 100 таблиц. Сам сервер AWS RDS db.t3.medium (2VCpu / 4GB / General Purpose SSD (gp2)). Во время запроса нагрузка на CPU не выше 5%, максимум памяти 3GB, Write/Read IOPS 4/20.
Есть следующая таблица:
SHOW TABLE STATUS like 'table'
+--------------------+------+-------+----------+--------+--------------+-----------+---------------+------------+---------+--------------+-------------------+-----------+----------+-----------------+--------+--------------+-------+
|Name                |Engine|Version|Row_format|Rows    |Avg_row_length|Data_length|Max_data_length|Index_length|Data_free|Auto_increment|Create_time        |Update_time|Check_time|Collation        |Checksum|Create_options|Comment|
+--------------------+------+-------+----------+--------+--------------+-----------+---------------+------------+---------+--------------+-------------------+-----------+----------+-----------------+--------+--------------+-------+
|table               |InnoDB|10     |Compact   |12675958|184           |2339373056 |0              |1447084032  |7340032  |12927969      |2021-10-01 00:00:02|NULL       |NULL      |cp1251_general_ci|NULL    |              |       |
+--------------------+------+-------+----------+--------+--------------+-----------+---------------+------------+---------+--------------+-------------------+-----------+----------+-----------------+--------+--------------+-------+

Сктрутура:
Create Table
CREATE TABLE `table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `a` int(11) NOT NULL,
  `b` decimal(10,5) NOT NULL,
  `c` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `a_c` (`a`,`c`),
) ENGINE=InnoDB AUTO_INCREMENT=12927969 DEFAULT CHARSET=cp1251"


Количество записей в ключе a_c - около 3000 штук

Запрос:
SELECT a, c, SUM(b) FROM table GROUP BY a, c

Explain:
+--+-----------+--------------------+-----+-------------+-------+-------+----+--------+-----+
|id|select_type|table               |type |possible_keys|key    |key_len|ref |rows    |Extra|
+--+-----------+--------------------+-----+-------------+-------+-------+----+--------+-----+
|1 |SIMPLE     |table               |index|a_c          |a_c    |8      |NULL|12675958|NULL |
+--+-----------+--------------------+-----+-------------+-------+-------+----+--------+-----+

Так вот - этот запрос выполняет на этой таблице 49 минут! Почему так долго и как оптимизировать?
  • Вопрос задан
  • 1020 просмотров
Пригласить эксперта
Ответы на вопрос 4
@galaxy
А почему, собственно, он должен быстро выполняться?
Запрос вынужден прочитать все 12+ млн строк, сргуппировать и просуммировать значения. Думаете тут какой-то волшебный индекс спасет?

Делайте materialized view (точнее, эмулируйте их через триггеры)
Ответ написан
ipatiev
@ipatiev
Потомок старинного рода Ипатьевых-Колотитьевых
Я не очень понимаю во всех этих AWS, но расход памяти в три гига - это какая-то чушь.

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

Вообще цифры странные. Полное ощущение что индекс не влезает в память и идёт постоянная работа с диском. Но тогда должен процессор зашкаливать. А он на 5 процентах. Вот не понимаю я эти ваши авс.
Ответ написан
ThunderCat
@ThunderCat Куратор тега MySQL
{PHP, MySql, HTML, JS, CSS} developer
имхо:
1) Поиграться в отсечку: ставите лимит 10, постепенно потом увеличивая его. Если на каком-то значении идет резкий рост времени - проблема настроек, крутить буфера, память и вот это все. Если рост линейный или близкий к таковому - проблема скорее всего с железом/софтом в целом.
2) Попробовать выключить репликацию, вполне возможно что затык на уровне софта реплики.
3) Перенести базу на локальную машину, посмотреть как ведет себя запрос на другой машине. Будет хотя бы понятно примерный разброс времени.
Ответ написан
Комментировать
@ehevnlem
Программирую с 1975, в интернете с 1993.
если у вас есть хардрайв то у вас блок головок дергается туда сюда. надо это выснить и если да то мелкие таблицы в память. когда то давно меня попросили ускорить прогу которая считала сутки. я сказал что будет 15 мин. ошибся, она работала 35 мин. там была такая же продлема
Ответ написан
Ваш ответ на вопрос

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

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