这一次,我们在索引和提交
频率对InnoDB表写
速度的
影响看,看有什么需要注意的。
让我们直接得出一些结论。
1。索引对写作速度的影响:
A,如果有一个自增加的主键和相对完整的没有索引,写速度大约是3.11%。
B,如果有一个自添加主键,二级索引相对完全索引,写速度减少约27.37%。
因此,InnoDB表都必须有一个自增列作为主键。
2。提交频率对写入速度的影响(以主键仅在表中添加的场景,以及数据的30万行作为示例)。
a,
等待所有数据被写入,提交提交的最终
执行效率最高。
每10万行提交一次,相对一次性提交,约1.17%份;
每1万行提交一次,相对一次性提交,约3.01%份;
每1000行提交一次,相对一次性提交,约23.38%份;
每100行提交一次,相对一次性提交,约24.44%份;
F,每10行提交一次,相对一次性提交,约92.78%份;
每一行提交一次,相对一次性提交,约546.78%份,即慢5倍;
因此,最好是在所有事务结束后批量提交所有事务,而不是每次执行SQL后提交它。
有一个使mysqldump
启用扩展插入和导出SQL
脚本对比试验,它比以前慢5倍以上。
重要的是:这个建议不是绝对
正确的。这取决于具体的场景,如果是一个高并发性的在线业务,您需要尽快提交事务,以避免锁范围的扩大,但如果是在非高并发业务场景中,特别是在数据批量导入的
情况下,建议采用批提交。
下面是一个
详细的测试用例过程,感兴趣的同学可以看看:
如果表滴存在` mytab `;
创建表(` mytab `
` ID ` int(10)符号的非空auto_increment,
int(11)不是NULL
默认值0,
C2 int(11)不是NULL默认值0,
` C3 `时间零违约current_timestamp更新current_timestamp,
` C4 ` varchar(200)不为空的默认,
主键(id)
InnoDB引擎=);
Where DELIMITER
如果存在` insert_mytab `下降过程;
创建
程序` insert_mytab `(在行号int,在commitrate int)
开始
声明int默认为0;
设置自动提交= 0;
当我0)和(我commitrate = 0)然后
承诺;
选择concat('commitrate:',commitrate,' ',我);
最后如果;
结束的时候;
最后再提交,确保成功。
承诺;
选择全部提交;
结束;***
#测试呼叫
电话insert_mytab(300000, 1);一个提交
电话insert_mytab(300000, 10);一个提交每10次
电话insert_mytab(300000, 100);一个提交每100次
电话insert_mytab(300000, 1000);一个提交每1000次
电话insert_mytab(300000, 10000);-每1万份
电话insert_mytab(300000, 100000);一个提交每10万次
电话insert_mytab(300000, 0);一次提交
测试耗时比较: