一次大的更新请求?

时间:2017-10-24 12:13:39

标签: mysql bulkupdate

在我的代码中,我通过foreach循环构建了一个CASE WHEN语句,以便更新一些数据。

问题是我可能最终得到一百行声明甚至更多,我想知道一次使用如此大的更新请求是否安全。我应该将我的请求分成小块吗?

基本上,该表的结构如下:

CREATE TABLE 'table_example' (
'id' INT UNSIGNED NOT NULL ,
'attr_1' INT UNSIGNED NOT NULL ,
'attr_2' INT UNSIGNED NOT NULL ,
'attr_3' DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' ,
'attr_4' DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' ,
'attr_5' TINYINT UNSIGNED NOT NULL ,
'attr_6' TINYINT UNSIGNED NOT NULL ,
'attr_7' TINYINT UNSIGNED NOT NULL ,
'attr_8' SMALLINT UNSIGNED NOT NULL ,
'attr_9' VARCHAR(50) NOT NULL ,
'attr_10' SMALLINT UNSIGNED NOT NULL ,
'attr_11' TINYINT(1) UNSIGNED NOT NULL , 
'attr_12' TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,
INDEX 'idx_id' ('id' ASC) )
ENGINE = MyISAM DEFAULT CHARSET=utf8;`

一旦构建,CASE WHEN语句可能如下所示:

CASE attr_1  
WHEN id = 1 THEN 5  
WHEN id = 2 THEN 8  
... // could be hundreds more lines here  
ELSE attr_1   
END,  
CASE attr_2  
WHEN id = 1 THEN 96   
WHEN id = 2 THEN 45   
...  // could be hundreds more lines here  
ELSE attr_2   
END,  
... // and so on for each attribute`  

1 个答案:

答案 0 :(得分:0)

根据我在MySQL的经验,通过字符数来限制查询的大小是明智的。如果您将查询字符数保持在10K左右 -  20K字符或更少,您将获得不错的效率。与此同时,您不会冒任何缓冲区溢出的风险。

为什么较大的查询更有效?在InnoDB的世界中,这是因为每个单个查询本身就是一个事务。逐行完成的批量更新可以每行生成一个事务(一次提交)。这会让事情变慢。

获得效率的另一种方法是将更新操作包装在单个事务中:

START TRANSACTION;
UPDATE something SET col='val' WHERE id='id';
UPDATE something SET col='val' WHERE id='id';
UPDATE something SET col='val' WHERE id='id';
COMMIT;

这节省了时间,因为COMMIT消耗了大部分时间。但是如果你在交易中放置了数十万个操作,那么它可以通过大量的交易来淹没你的服务器。