另一種方法是增加一個彙總表:
create table summary (col varchar(10) primary key, items int not null);
,並添加一些觸發器TBL使:
上插入:
insert into summary values(new.col, new.items)
on duplicate key update set summary.items = summary.items + new.items;
上刪除:
update summary set summary.items = summary.items - old.items where summary.col = old.col
on update :
update summary set summary.items = summary.items - old.items where summary.col = old.col;
update summary set summary.items = summary.items + new.items where summary.col = new.col;
這會減慢你的刀片,而且允許你打在彙總表中的一行爲
select items from summary where col = 'val';
這樣做的最大問題是自舉彙總表的值。如果您可以使應用程序脫機,則可以使用tbl中的值輕鬆初始化摘要。
insert into summary select col, sum(items) from tbl group by col;
但是,如果您需要保持服務運行,則要困難得多。如果您有副本,則可以停止複製,構建摘要表,安裝觸發器,重新啓動複製,然後將服務故障轉移到使用副本,然後在退役的主服務器上重複該過程。
如果你不能做到這一點,那麼你可以更新彙總表山坳一個值在同一時間,以減少影響:
lock table write tbl, summary;
delete from summary where col = 'val';
insert into summary select col, sum(items) from tbl where col = 'val';
unlock tables;
或者,如果你能忍受長時間的中斷:
lock table write tbl, summary;
delete from summary;
insert into summary select col, sum(items) from tbl group by col;
unlock tables;
你使用什麼存儲引擎? MyISAM還是Innodb? – Martin 2010-02-24 15:19:57
我正在使用MyISAM。 – viraptor 2010-02-24 15:22:25