Сколько времени должен занимать такой запрос 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 минут! Почему так долго и как оптимизировать?
  • Вопрос задан
  • 85 просмотров
Пригласить эксперта
Ответы на вопрос 3
@galaxy
А почему, собственно, он должен быстро выполняться?
Запрос вынужден прочитать все 12+ млн строк, сргуппировать и просуммировать значения. Думаете тут какой-то волшебный индекс спасет?

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

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

Вообще цифры странные. Полное ощущение что индекс не влезает в память и идёт постоянная работа с диском. Но тогда должен процессор зашкаливать. А он на 5 процентах. Вот не понимаю я эти ваши авс.
Ответ написан
BojackHorseman
@BojackHorseman Куратор тега MySQL
...в творческом отпуске...
озу не хватает и тупо падает в своп
Ответ написан
Ваш ответ на вопрос

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

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