MySQL内存引擎性能 - 并发插入与更新

时间:2016-05-05 13:49:05

标签: mysql performance

提前感谢您的帮助!

问题

使用MySQL Memory Storage Engine对一个简单的表执行大量并发写入时,所有写入之间存在客观的性能差异(A)更新到非常小的表(比如说100行)vs( B)插入?根据性能差异,我在考虑速度/锁定 - 但如果有其他重要变量,请说出来。由于这个不那么具体的问题的答案通常是“它取决于”我写的情景(A)& (B)下面提供上下文&定义细节,希望得到客观的答案。

示例方案

我写了剧情(A)& (B)以下帮助说明&提供背景。你可以假设超过RAM& CPU,MySQL 5.7,如果它重要,方案是简化的,我正在使用内存引擎从等式中删除磁盘I / O(我知道它使用表级锁定)。再次感谢您的帮助!

〜场景A~

1)我有一个约100行的内存表,如下所示:

CREATE TABLE cache (
  campaign_id MEDIUMINT UNSIGNED NOT NULL,
  sum_clicks SMALLINT UNSIGNED NOT NULL DEFAULT 0,
  PRIMARY KEY (campaign_id)
) Engine=MEMORY DEFAULT CHARSET=latin1;

2)并且~1k工作线程如下所示填充所述表:

UPDATE cache SET sum_clicks+=x WHERE campaign_id=y;

3)最后,每隔约1小时运行一次的工作:

CREATE TABLE IF NOT EXISTS next_cache LIKE cache;
INSERT INTO next_cache (campaign_id) SELECT id FROM campaigns;
RENAME TABLE cache TO old_cache, next_cache TO cache;
SELECT * FROM old_cache...into somewhere else;
TRUNCATE old_cache;
RENAME TABLE old_cache TO next_cache; // for next time

〜场景B~

1)我有一个这样的记忆表:

CREATE TABLE cache (
  campaign_id MEDIUMINT UNSIGNED NOT NULL,
  sum_clicks SMALLINT UNSIGNED NOT NULL DEFAULT 0
) Engine=MEMORY DEFAULT CHARSET=latin1;

2)并且~1k工作线程如下所示填充所述表:

INSERT INTO cache VALUES (y,x);

3)最后,每隔约1小时运行一次的工作:

(~same thing as scenario A's 3rd step)

发布脚本

对于那些搜索stackOverflow的人,我发现了这些stackOverflow问题&答案很有帮助,特别是如果您愿意使用MEMORY引擎之外的存储引擎。 concurrent-insert-with-mysqlinsert-vs-update-mysql-7-million-rows

1 个答案:

答案 0 :(得分:1)

当1K工作线程击中此表时,他们将严重绊倒彼此。请注意,MEMORY使用锁定。使用InnoDB表格可能会更好。

无论引擎如何,都要批量生产。只要可行,INSERTs / UPDATEs。也就是说,在单个语句和/或单个事务中插入/更新多行。

Tips on high-speed ingestion - 我的'分期' table与您的'缓存非常相似,但用于不同目的。