[MySQL优化案例]系列 — 索引、提交频率对InnoDB表写入速度的影响

简介: [MySQL优化案例]系列 — 索引、提交频率对InnoDB表写入速度的影响

本次,我们通过对比,明明白白的知道索引、提交频率对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); -- 一次性提交


测试耗时结果对比:

image.png




            </div>
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
JSON NoSQL MongoDB
MongoDB——基础语法
MongoDB——基础语法
242 0
MongoDB——基础语法
|
JavaScript 算法 UED
虚拟 DOM 是如何避免频繁重绘的?
虚拟 DOM 通过构建虚拟 DOM 树、比较差异、批量更新、精确更新、异步更新以及局部渲染优化等多种机制,有效地避免了频繁重绘,提高了页面的渲染性能和用户体验。这些机制相互配合,使得虚拟 DOM 在处理复杂的页面更新时能够更加高效和智能,减少不必要的性能开销。
260 58
|
缓存 运维 监控
Linux 基础-查看进程命令 ps 和 top
Linux 基础-查看进程命令 ps 和 top
841 0
|
Kubernetes 网络协议 Docker
Kubernetes网络分析-Container间通信
本文假设你已经搭建好了Kubernetes集群,那么请求是如何到达POD,然后被Container处理的。都是干货。如果没听说过Kubernetes,不知道POD是什么,请先参考: http://www.
2340 0
|
6天前
|
数据采集 人工智能 安全
|
15天前
|
云安全 监控 安全
|
1天前
|
存储 SQL 大数据
删库跑路?别慌!Time Travel 带你穿回昨天的数据世界
删库跑路?别慌!Time Travel 带你穿回昨天的数据世界
241 156