MySQL自增列锁模式 innodb_autoinc_lock_mode不同参数下性能测试
20190701:感谢@接天居士的提示,在多核心CPU的配置环境下测试,确实是有差异的,感谢纠错,本来想删除这篇文章的,留着当错教训吧,测试环境差异造成的错误教训
对于innodb_autoinc_lock_mode 各种参数的值的含义,网上也有各种详解,看完觉得意犹未尽,这里不做阐述,只动手测试,看看性能上,到底有没有理论上所说的差别。
对于自增列的锁定,据说是innodb_autoinc_lock_mode = 2模式下有较高的性能,MySQL 8.0下innodb_autoinc_lock_mode 默认值为2。
于是通过修改改参数,测试不同参数下的一些性能表现,其结果还是比较出乎意料的……
测试环境:
MySQL 8.0.12 ON CentOS 7,1核1G内存
虽然环境资源配置有限,这里目的不是做性能测试,主要是对比在innodb_autoinc_lock_mode = 0和 2模式下的性能对比(没有做参数为1的情况)
测试方法:
本地Python开启多个线程,每个线程循环一定的数量,向某一个表中插入数据,看最终的时间表现情况
测试代码如下,开启20个线程,每个线程循环插入10000条数据,同时将当前线程Id写入当前数据行中(用来多个线程的执行是否是均匀或者说是交替的),看最终的时间。
#coding=utf-8
import threading
import pymysql
from time import ctime,sleep connstr_tencent = {'host': '***.***.***.***', 'port': 3306, 'user': 'root', 'password': 'root', 'db': 'db01', 'charset': 'utf8mb4'}
def access_mysql(para):
conn = pymysql.connect(host=connstr_tencent['host'],
port=connstr_tencent['port'],
user=connstr_tencent['user'],
password=connstr_tencent['password'],
db=connstr_tencent['db'],
charset=connstr_tencent['charset'],
connect_timeout = 100000 )
cursor = conn.cursor()
for i in range(10000):
cursor.execute(" insert into test_autoicrement(col2,col3,col4) values ('thread:{0}','thread:{0}','thread:{0}'); ".format(str(para)))
cursor.close()
conn.commit()
conn.close() def main():
# 生成线程
threads = []
for i in range(20):
t = threading.Thread(target=access_mysql, args=(i,))
threads.append(t)
for t in threads:
t.setDaemon(True)
t.start()
for t in threads:
t.join() if __name__ == '__main__':
print("begin at {0}".format(ctime()))
main()
print("finsh at {0}".format(ctime()))
测试结果1,未开启binlog的情况
测试结果2,开启binlog的情况
测试结果仅仅是本地软硬件环境下表出现来的结果,主要目的是不同参数的性能对比
测试说明:
1,每次修改innodb_autoinc_lock_mode 之后,truncate测试表,并重启MySQL服务。
2,innodb_autoinc_lock_mode =0或者2做交叉测试,
也即测试一次innodb_autoinc_lock_mode =0的,truncate 测试表,重启MySQL服务,然后再测试innodb_autoinc_lock_mode =2的情况。
3,不管是innodb_autoinc_lock_mode 为0或者2,(当前测试条件下)均未发现跳号的情况。
4,多线程测试下,记录都记录是当前线程的id,每次检验最终测试数据的分布情况,基本上都是每个线程均匀交替执行插入的,参考下图。
结论:
1,至少在MySQL 8.0下,innodb_autoinc_lock_mode 的值设置为0或者2的情况下,在性能上,没有发现明显的差异。
2,开启binlog的情况下,可能是测试数据量或者并发量不够,未发现比没有开启binlog有明显的性能下降。
另外:
一开始本地的Python连接5.7是没有问题的,连接MySQL8.0是直接报错,然后升级pymysql即可,
pymysql的版本笔者直接从0.7升级到0.9,不知道0.8版本的是否可以连接MySQL 8.0。
20190701:感谢@接天居士的提示,在多核心CPU的配置环境下测试,确实是有差异的,感谢纠错,本来想删除这篇文章的,留着当错教训吧,测试环境差异造成的错误教训
关于innodb_autoinc_lock_mode参数,参考:
http://seanlook.com/2017/02/16/mysql-autoincrement/
https://www.cnblogs.com/JiangLe/p/6362770.html
MySQL自增列锁模式 innodb_autoinc_lock_mode不同参数下性能测试的更多相关文章
- (转)mysql自增列导致主键重复问题分析
mysql自增列导致主键重复问题分析... 原文:http://www.cnblogs.com/cchust/p/3914935.html 前几天开发童鞋反馈一个利用load data infile ...
- MySQL自增锁模式innodb_autoinc_lock_mode参数理解调优
前段时间某数据表运行过程中,出现自增字段突然跳跃式增长的问题,潜心研究发现,问题导致原因可能是因为并发写入导致 于是通过各种途径查阅是因为innodb_autoinc_lock_mode参数设置的不同 ...
- mysql自增列导致主键重复问题分析。。。
前几天开发童鞋反馈一个利用load data infile命令导入数据主键冲突的问题,分析后确定这个问题可能是mysql的一个bug,这里提出来给大家分享下.以免以后有童鞋遇到类似问题百思不得其解,难 ...
- MySQL自增列(AUTO_INCREMENT)相关知识点总结
MySQL的自增列(AUTO_INCREMENT)和其它数据库的自增列对比,有很多特性和不同点(甚至不同存储引擎.不同版本也有一些不同的特性),让人感觉有点稍微复杂.下面我们从一些测试开始,来认识 ...
- Mysql 自增列 主键
Mysql中假如有 ID Int auto_increment, CID varchar(36). 通常情况下都是 ID设置为主键. 假如要设置CID为主键.自增列ID必需是唯一索引. create ...
- 重置Mysql自增列的开始序号
ALTER TABLE TableName AUTO_INCREMENT = 5; 代表重新从5开始(包括5)
- MySQL AutoIncrement--自增锁模式
自增锁模式 在MYSQL 5.1.22版本前,自增列使用AUTO_INC Locking方式来实现,即采用一种特殊的表锁机制来保证并发插入下自增操作依然是串行操作,为提高插入效率,该锁会在插入语句完成 ...
- mysql 深度解析auto-increment自增列"Duliplicate key"问题
转载自:https://cloud.tencent.com/developer/article/1367681 问题描述 近期,线上有个重要Mysql客户的表在从5.6升级到5.7后master上插入 ...
- 怎么重置mysql的自增列AUTO_INCREMENT初时值
重置 MySQL 自增列 AUTO_INCREMENT 初时值 注意, 使用以下任意方法都会将现有数据删除. 方法一: delete from tb1; ALTER TABLE tbl AUTO_IN ...
随机推荐
- Python之 操作 MySQL 数据库
什么是MySQLdb? MySQLdb 是用于Python链接Mysql数据库的接口,它实现了 Python 数据库 API 规范 V2.0,基于 MySQL C API 上建立的. 安装 Pytho ...
- vue-router 路由跳转:和name配对的是params,和path配对的是query
1.命名路由name搭配params,刷新页面参数会丢失 2.路由path搭配query,刷新页面数据不会丢失 3.接收参数使用this.$router,就能获取到参数的值
- TZipFile FileNames中文乱码解决办法
TEncoding.Default.GetString(zip.FileInfo[0].FileName); 补充说明: Zip.Extract(Zip.FileName[0], 'd:\'); 解压 ...
- win10 家庭版 升级 win10企业版
更改秘钥 我的电脑(右键)->属性-> 更改产品秘钥 -> 96YNV-9X4RP-2YYKB-RMQH4-6Q72D->重启系统 如果秘钥过期了,就百度按时间搜索,总有一个是 ...
- Spring编程式事务管理和声明式事务管理
本来想写一篇随笔记一下呢,结果发现一篇文章写的很好了,已经没有再重复写的必要了. https://www.ibm.com/developerworks/cn/education/opensource/ ...
- 20175311胡济栋 2018-2019-2《Java程序设计》结对编程项目-四则运算 第二周 阶段性总结
20175311胡济栋 2018-2019-2<Java程序设计>结对编程项目-四则运算 第二周 阶段性总结 需求分析 这是利用栈来设计一个计算器的第二阶段总结. 自动生成四则运算的题目( ...
- ubuntu 装机步骤表
步骤 1. root 步骤 apt-get update ; apt-get upgrate apt-get install git zsh apt-get install -y make build ...
- MyEclipse2015优化
< MyEclipse 2015优化七步法<亲测有效> > l 去除无需加载的模块 Window --> Preferences -->General --> ...
- shell脚本三——正则表达式
shell函数:shell中允许将一组命令集合或语句形成一段可用代码,这些代码块称为shell函数.给这段代码起个名字称为函数名,后续可以直接调用该段代码. 格式:fun() { 命令 } Shell ...
- php的运行模式
1.php最常见的五种运行模式. CGI 通用网关接口 FastCGI 常驻内存的CGI CLI 命令行 Web模块 Apache等Web服务器 模块的形式加载php进程 ISAPI 已经不用了