Лучшая практика заключается в использовании нормализованной схемы базы данных. Затем СУБД обновляет его, поэтому вам не нужно.
Но я понимаю компромисс, который делает денормализованный дизайн привлекательным. В этом случае лучше всего обновлять итоги по каждому изменению. Исследуйте триггеров . Преимущество этой практики заключается в том, что вы можете синхронизировать результаты с изменениями, чтобы вам никогда не приходилось думать о том, устарела она или нет. Если зафиксировано одно изменение, обновленная сумма также фиксируется.
Однако в этом есть некоторые недостатки в отношении одновременных изменений. Если вам необходимо учесть одновременные изменения в одних и тех же итогах, и вы можете допустить, чтобы итоги были «в конечном итоге непротиворечивыми», то используйте периодический пересчет от общей суммы, поэтому вы можете быть уверены, что одновременно выполняется только один процесс. изменение итога.
Еще одна полезная практика - кэшировать совокупные итоги вне базы данных, например, memcached или в переменных приложения, поэтому вам не нужно обращаться к базе данных каждый раз, когда вам нужно отобразить значение.
Запрос "select sum(points) as total from points where id = ?
" должен не занимать 2 секунды, даже если у вас огромное количество строк и много запросов.
Если у вас есть индекс покрытия , определенный для (id, points)
, тогда запрос может выдать результат, вообще не считывая данные из таблицы; он может вычислить итоговое значение путем считывания значений из самого индекса. Используйте EXPLAIN для анализа вашего запроса и найдите примечание «Использование индекса» в столбце «Extra».
CREATE TABLE Points (
id INT,
points INT,
reason VARCHAR(10),
KEY id (id,points)
);
EXPLAIN SELECT SUM(points) AS total FROM Points WHERE id = 1;
+----+-------------+--------+------+---------------+------+---------+-------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+------+---------------+------+---------+-------+------+--------------------------+
| 1 | SIMPLE | points | ref | id | id | 5 | const | 9 | Using where; Using index |
+----+-------------+--------+------+---------------+------+---------+-------+------+--------------------------+