探究MySQL中索引和提交频率对InnoDB表写入速度的影响
本次,我们来看看索引、提交频率对InnoDB表写入速度的影响,了解有哪些需要注意的。 先直接说几个结论吧: 1、关于索引对写入速度的影响: 因此,InnoDB表最好总是有一个自增列做主键。 2、关于提交频率对写入速度的影响(以表中只有自增列做主键的场景,一次写入数据30万行数据为例): a、等待全部数据写入完成后,最后再执行commit提交的效率最高; 因此,最好是等待所有事务结束后再批量提交,而不是每执行完一个SQL就提交一次。 下面是详细的测试案例过程,有兴趣的同学可以看看: DROP TABLE IF EXISTS `mytab`; CREATE TABLE `mytab` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT,`c1` int(11) NOT NULL DEFAULT ‘0',`c2` int(11) NOT NULL DEFAULT ‘0',`c3` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,`c4` varchar(200) NOT NULL DEFAULT ”,PRIMARY KEY (`id`) ) ENGINE=InnoDB; DELIMITER $$$ DROP PROCEDURE IF EXISTS `insert_mytab`; CREATE PROCEDURE `insert_mytab`(in rownum int,in commitrate int) BEGIN DECLARE i INT DEFAULT 0; SET AUTOCOMMIT = 0; WHILE i < rownum DO INSERT INTO mytab(c1,c2,c3,c4) VALUES( FLOOR(RAND()*rownum),FLOOR(RAND()*rownum),NOW(),REPEAT(CHAR(ROUND(RAND()*255)),200)); SET i = i+1; /* 达到每 COMMITRATE 频率时提交一次 */ IF (commitrate > 0) AND (i % commitrate = 0) THEN COMMIT; SELECT CONCAT(‘commitrate: ‘,commitrate,‘ in ‘,I); END IF; END WHILE; /* 最终再提交一次,确保成功 */ COMMIT; SELECT ‘ALL COMMIT;'; END; $$$ #测试调用 call insert_mytab(300000,1); ― 每次一提交 call insert_mytab(300000,10); ― 每10次一提交 call insert_mytab(300000,100); ― 每100次一提交 call insert_mytab(300000,1000); ― 每1千次一提交 call insert_mytab(300000,10000); ― 每1万次提交 call insert_mytab(300000,100000); ― 每10万次一提交 call insert_mytab(300000,0); ― 一次性提交 测试耗时结果对比: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- sqlserver通过存储过程添加登陆用户
- SQLServer2008快捷键集合
- sql-server – 如何在SQL Server中选择聚簇索引?
- Window 下安装Mysql5.7.17 及设置编码为utf8的方法
- MySQL优化表时提示 Table is already up to date的解决方法
- 【SQLServer】临时表的一些应用
- sql-server – 使用OpenRowSet导入.CSV文件时,将科学符号转
- SQL SERVER分页存储过程(用存储过程实现数据库的分页代码)
- SQL中Having与Where的区别及注意
- openfire + sqlserver ,以及现有系统的账户集成