探究MySQL中索引和提交频率对InnoDB表写入速度的影响

作者:goldensun 时间:2024-01-26 08:03:22 

本次,我们来看看索引、提交频率对InnoDB表写入速度的影响,了解有哪些需要注意的。

先直接说几个结论吧:

1、关于索引对写入速度的影响:
a、如果有自增列做主键,相对完全没索引的情况,写入速度约提升 3.11%;
b、如果有自增列做主键,并且二级索引,相对完全没索引的情况,写入速度约降低 27.37%;

因此,InnoDB表最好总是有一个自增列做主键。

2、关于提交频率对写入速度的影响(以表中只有自增列做主键的场景,一次写入数据30万行数据为例):

a、等待全部数据写入完成后,最后再执行commit提交的效率最高;
b、每10万行提交一次,相对一次性提交,约慢了1.17%;
c、每1万行提交一次,相对一次性提交,约慢了3.01%;
d、每1千行提交一次,相对一次性提交,约慢了23.38%;
e、每100行提交一次,相对一次性提交,约慢了24.44%;
f、每10行提交一次,相对一次性提交,约慢了92.78%;
g、每行提交一次,相对一次性提交,约慢了546.78%,也就是慢了5倍;

因此,最好是等待所有事务结束后再批量提交,而不是每执行完一个SQL就提交一次。
曾经有一次对比测试mysqldump启用extended-insert和未启用导出的SQL脚本,后者比前者慢了不止5倍。
重要:这个建议并不是绝对成立的,要看具体的场景。如果是一个高并发的在线业务,就需要尽快提交事务,避免锁范围被扩大。但如果是在非高并发的业务场景,尤其是做数据批量导入的场景下,就建议采用批量提交的方式。

下面是详细的测试案例过程,有兴趣的同学可以看看:


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); — 一次性提交

测试耗时结果对比:

探究MySQL中索引和提交频率对InnoDB表写入速度的影响

标签:MySQL
0
投稿

猜你喜欢

  • Python实现自动签到脚本的示例代码

    2021-07-07 14:08:37
  • Pytorch学习笔记DCGAN极简入门教程

    2022-05-28 17:29:02
  • Dreamweaver MX网页图片热区使用方法

    2008-05-20 12:50:00
  • vuex实现购物车功能

    2024-05-08 10:43:27
  • 找到MySQL的优点

    2024-01-23 01:28:47
  • Pyhhon之Pygame的Font文本和字体

    2021-08-14 13:00:33
  • Pytorch复现扩散模型的示例详解

    2023-08-15 02:12:33
  • 用Python编写分析Python程序性能的工具的教程

    2022-02-13 01:57:03
  • python-pymysql获取字段名称-获取内容方式

    2024-01-21 05:19:44
  • Matlab中关于argmax、argmin函数的使用解读

    2023-06-27 20:36:53
  • Sublime中View in Browser功能不生效问题及解决

    2022-07-03 05:48:16
  • python文件操作整理汇总

    2022-08-16 16:46:25
  • 高效交换XML文档

    2008-01-03 14:16:00
  • Python lambda表达式filter、map、reduce函数用法解析

    2022-03-30 03:52:31
  • 如何使用索引提高查询速度

    2024-01-15 02:14:15
  • 手把手带你走进Go语言之类型转换

    2024-02-14 23:25:05
  • Vue.js学习笔记之常用模板语法详解

    2024-06-07 15:21:54
  • python处理两种分隔符的数据集方法

    2023-06-17 11:24:54
  • OpenCV图像修复cv2.inpaint()的使用

    2022-07-03 05:47:57
  • 关于Python如何安装requests库

    2021-10-18 04:12:38
  • asp之家 网络编程 m.aspxhome.com