最高效的MySQL查询从相同的内存表更新表

时间:2009-06-24 11:17:14

标签: sql mysql performance

我正在为一个看起来像这样(简化)的表实现一个内存缓存:

Item1(整数),Item2(整数),cnt(整数)

原始表包含数百万对这样的对。它会迅速更新。

为了提高效率,我希望将新对写入相同的内存表,并通过cron定期更新磁盘上的实际表。

cron应该执行以下操作:对于每对,如果非内存表中存在类似的对,则将计数增加内存表中的计数。如果不存在这样的对,则使用内存表中的count来创建它。

如何使刷新(从内存表到实际表)最有效?

注意:环境是Mysql 5.0.45 PHP 5.2.6 CentOS

2 个答案:

答案 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上的开销)