我有一张在我的服务器上使用myisam引擎的表。平均每秒有10个更新语句。我发现mysql进程磁盘写入比理论值高很多。经过实验,我怀疑修改任何数据列会重写整行数据。以下是一个实验...
我的表:
CREATE TABLE `test_update` (
`id` int(11) NOT NULL DEFAULT '0',
`str1` blob,
`str2` blob,
`str3` blob,
`update_time` int(11) DEFAULT '0',
PRIMARY KEY (`id`),
KEY `update_time` (`update_time`)
) ENGINE=MyISAM;
我插入了100000行数据,每行有30k字符串(每个blob 10k)。之后我随机更新'update_time'列1行/秒
while 1:
sql = "update test_update set update_time=%d where id=%d" %(now, randomid)
cur.execute(sql)
conn.commit()
slp_t = 1-(time.time()-end)
if slp_t>0:
time.sleep(slp_t)
end=time.time()
和iotop显示:
https://i.stack.imgur.com/sJa8y.png
似乎修改int列会重写整行(甚至更多)。真的吗?如果答案是肯定的,为什么它的设计是这样的呢?我该怎么做才能避免这种浪费?