提前感谢您的帮助!
问题
使用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-mysql和 insert-vs-update-mysql-7-million-rows
答案 0 :(得分:1)
当1K工作线程击中此表时,他们将严重绊倒彼此。请注意,MEMORY
使用表锁定。使用InnoDB
表格可能会更好。
无论引擎如何,都要批量生产。只要可行,INSERTs
/ UPDATEs
。也就是说,在单个语句和/或单个事务中插入/更新多行。
Tips on high-speed ingestion - 我的'分期' table与您的'缓存非常相似,但用于不同目的。