我正在为一个看起来像这样(简化)的表实现一个内存缓存:
Item1(整数),Item2(整数),cnt(整数)
原始表包含数百万对这样的对。它会迅速更新。
为了提高效率,我希望将新对写入相同的内存表,并通过cron定期更新磁盘上的实际表。
cron应该执行以下操作:对于每对,如果非内存表中存在类似的对,则将计数增加内存表中的计数。如果不存在这样的对,则使用内存表中的count来创建它。
如何使刷新(从内存表到实际表)最有效?
注意:环境是Mysql 5.0.45 PHP 5.2.6 CentOS
答案 0 :(得分:3)
您可以使用INSERT ... ON DUPLICATE KEY UPDATE
查询 - 但这取决于主表上的主键或UNIQUE
索引。
INSERT
INTO <<master_table>> (Item1, Item2, cnt)
SELECT Item1, Item2, cnt FROM <<memory_table>>
ON DUPLICATE KEY UPDATE cnt = cnt + VALUES(cnt);
答案 1 :(得分:2)
在磁盘表上创建PRIMARY KEY
:
ALTER TABLE maintable ADD CONSTRAINT pk_maintable_item1_item2 (item1, item2)
并发出以下查询:
INSERT
INTO maintable
SELECT item1, item2, COUNT(*) AS cnt
FROM memtable mem
GROUP BY
item1, item2
ON DUPLICATE KEY
UPDATE cnt = maintable.cnt + mem.cnt
但请注意,如果您有很多DISTINCT item1, item2
对,那么@S. Gehrig
提议的solution很可能会更好(由于GROUP BY
上的开销)