Оптимальный запрос для получения накопительной суммы в MySQL

Что такое «правильный» запрос для получения кумулятивной суммы в MySQL?

У меня есть таблица, где я храню информацию о файлах, один список столбцов содержит размер файлов в байтах. (фактические файлы хранятся где-то на диске)

Я хотел бы получить совокупный размер файла, как это:

+------------+---------+--------+----------------+
| fileInfoId | groupId | size   | cumulativeSize |
+------------+---------+--------+----------------+
|          1 |       1 | 522120 |         522120 |
|          2 |       2 | 316042 |         316042 |
|          4 |       2 | 711084 |        1027126 |
|          5 |       2 | 697002 |        1724128 |
|          6 |       2 | 663425 |        2387553 |
|          7 |       2 | 739553 |        3127106 |
|          8 |       2 | 700938 |        3828044 |
|          9 |       2 | 695614 |        4523658 |
|         10 |       2 | 744204 |        5267862 |
|         11 |       2 | 609022 |        5876884 |
|        ... |     ... |    ... |            ... |
+------------+---------+--------+----------------+
20000 rows in set (19.2161 sec.)

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

SELECT
  a.fileInfoId
, a.groupId
, a.size
, SUM(b.size) AS cumulativeSize
FROM fileInfo AS a
LEFT JOIN fileInfo AS b USING(groupId)
WHERE a.fileInfoId >= b.fileInfoId
GROUP BY a.fileInfoId
ORDER BY a.groupId, a.fileInfoId

Мое решение, однако, очень медленно. (около 19 секунд без кеша).

Объяснить дает следующие детали исполнения

+----+--------------+-------+-------+-------------------+-----------+---------+----------------+-------+-------------+
| id | select_type  | table | type  | possible_keys     | key       | key_len | ref            | rows  | Extra       |
+----+--------------+-------+-------+-------------------+-----------+---------+----------------+-------+-------------+
|  1 | SIMPLE       |     a | index | PRIMARY,foreignId | PRIMARY   |       4 | NULL           | 14905 |             |
|  1 | SIMPLE       |     b | ref   | PRIMARY,foreignId | foreignId |       4 | db.a.foreignId |    36 | Using where |
+----+--------------+-------+-------+-------------------+-----------+---------+----------------+-------+-------------+



Мой вопрос:

Как я могу оптимизировать вышеуказанный запрос?



Обновить
Я обновил вопрос, чтобы предоставить структуру таблицы и процедуру для заполнения таблицы 20 000 тестовыми данными записей.

CREATE TABLE `fileInfo` (
  `fileInfoId` int(10) unsigned NOT NULL AUTO_INCREMENT
, `groupId` int(10) unsigned NOT NULL
, `name` varchar(128) NOT NULL
, `size` int(10) unsigned NOT NULL
, PRIMARY KEY (`fileInfoId`)
, KEY `groupId` (`groupId`)
) ENGINE=InnoDB;

delimiter $
DROP PROCEDURE IF EXISTS autofill$
CREATE PROCEDURE autofill()
BEGIN
    DECLARE i INT DEFAULT 0;
    DECLARE gid INT DEFAULT 0;
    DECLARE nam char(20);
    DECLARE siz INT DEFAULT 0;
    WHILE i < 20000 DO
        SET gid = FLOOR(RAND() * 250);
        SET nam = CONV(FLOOR(RAND() * 10000000000000), 20, 36);
        SET siz = FLOOR((RAND() * 1024 * 1024));
        INSERT INTO `fileInfo` (`groupId`, `name`, `size`) VALUES(gid, nam, siz);
        SET i = i + 1;
    END WHILE;
END;$
delimiter ;

CALL autofill();

О возможном дублировании вопроса
Вопрос связаны сЗабытая точка с запятой это не тот же вопрос. У моего вопроса есть дополнительный столбец. из-за этого дополнительного столбца groupId принятый ответ там не работает для моей проблемы. (возможно, его можно адаптировать к работе, но я не знаю как, отсюда и мой вопрос)

Ответы на вопрос(2)

Ваш ответ на вопрос