MySQL插入性能优化
MySQL插入性能优化
标签: 博客
代码优化
values 多个
即拼接成一个insert values sql, 例如
INSERT INTO MyTable
( Column1, Column2, Column3 )
VALUES
('John', 123, 'Lloyds Office'),
('Jane', 124, 'Lloyds Office'),
('Billy', 125, 'London Office'),
('Miranda', 126, 'Bristol Office');
一个事务
开启一个事务,批量操作完了才提交事务,而不是,操作一次就提交一次,这样io太高,插入太慢。
插入字段尽量少,尽量用默认值
注意事项: max_allowed_packet 默认是1M,如何insert values sql 太大需要上调这个值
关闭 unique_checks
优化效果不是很明显,下面截图 选自 《MySQL 数据库开发、优化与管理维护 第2版》书籍
bulk_insert_buffer_size
这个参数只能对 MyISAM使用,innodb无效
配置优化
innodb_buffer_pool_size 缓冲区配置
什么是 innodb_buffer_pool_size
MySQL 缓存表数据,索引数据的地方。增加它的值可以减少 磁盘 io ,提升 读写性能。
提升读的原理:因为 buffer_pool_size 设置的比较大, 很多表数据和索引已缓存到 buffer pool , 要查询的数据在缓存中找到了,就不需要访问磁盘了。读性能就得到了提升。
提升写的原理:因为 buffer_pool_size 设置的比较大, 写的数据,暂时以脏页的方式放在内存,然后慢慢落到磁盘,如果buffer_pool_size 太小就没办法缓存写操作,写一次访问一次磁盘 ,写入性能就比较慢。(实际自测增大buffer_pool_size后,并未带来纯写操作的性能提升, 这块有待进一步研究)
设置多大的 innodb_buffer_pool_size 合适?
通常将innodb_buffer_pool_size其配置为物理内存的50%到75%
相关参数设置
innodb_buffer_pool_instances
一般将 innodb_buffer_pool_size 值增大后,需要增加配置 innodb_buffer_pool_instances 的值。
innodb_buffer_pool_instances 是 buffer_pool 实例数量,默认为1。增加它的值,可以减少数据库内部的资源竞争,增加并发处理能力。
如何设置innodb_buffer_pool_instances?
innodb_buffer_pool_instances 的范围是 1 (the default) up to 64 (the maximum). 可以将 innodb_buffer_pool_instances 的个数设置为 buffer pool size 的 十分之一, 比如 innodb_buffer_pool_size 是 30g ,那 innodb_buffer_pool_instances 就设置为 3;
innodb_buffer_pool_size 注意事项
因为有额外内存的使用,如果指定 innodb_buffer_pool_size 为 12g 实际占用内存可能是 14g +
事务日志配置
innodb_log_file_size
默认值 48MB
设置的太小:比如用默认值48MB,当一个日志文件写满后,innodb会自动切换到另外一个日志文件,而且会触发数据库的检查点(Checkpoint),这会导致innodb缓存脏页的小批量刷新,会明显降低innodb的性能。
设置的太大:设置很大以后减少了checkpoint,并且由于redo log是顺序I/O,大大提高了I/O性能。但是如果数据库意外出现了问题,比如意外宕机,那么需要重放日志并且恢复已经提交的事务,如果日志很大,那么将会导致恢复时间很长。甚至到我们不能接受的程度。
总结: innodb_log_file_size设置得太小无法释放数据库性能,设置得太大,会增加宕机后日志重放恢复的时间。
innodb_log_files_in_group
重做日志组中的日志数量,默认值是2 ,一般用默认值也可以。
innodb_log_buffer_size
将日志写入磁盘日志文件前的缓冲大小,默认值 8MB,一般用默认值也可以。
读写线程增加
innodb_write_io_threads
innodb_read_io_threads
innodb_thread_concurrency
实践比较
环境:centos 7, MySQL 6.7 , 8G,i5
操作:jmeter 64个并发插入数据,每个并发插入320条数据,每条数据插入前都会随机查询一次数据库。
优化前的配置
innodb_buffer_pool_size = 134217728 //128MB
innodb_buffer_pool_instances = 1
优化后的配置
innodb_buffer_pool_size = 1G
innodb_buffer_pool_instances = 1
性能结果
buffer_pool_size 128MB:耗时58s
buffer_pool_size 1GB:耗时172s
结论
buffer pool 缓冲区增加8倍内存, 换来 3 倍 读性能提升,3 倍 含读的写性能提升(含读的写,指的是在insert 前,进行了数据库查询,将查得的数据赋值给了 insert 字段), 对于纯写几乎没有性能提升。同理,如果缓冲区增加5.3倍内存,理论可以提升2倍性能提升。
硬件优化
最影响数据库性能的是磁盘,上 ssd 可以大大提升性能,其次是 cpu,内存 。
架构优化
读写分离
配置优化参考文章
https://mp.weixin.qq.com/s/DjM4jl5v0IleXLl_QFoyOw
https://github.com/jdaaaaaavid/mysql_best_configuration
MySQL插入性能优化的更多相关文章
- MySQL插入性能优化(转)
原文:http://tech.uc.cn/?p=634 对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长.特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时 ...
- mysql数据库性能优化(包括SQL,表结构,索引,缓存)
优化目标减少 IO 次数IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑,当 ...
- MySQL查询性能优化(精)
MySQL查询性能优化 MySQL查询性能的优化涉及多个方面,其中包括库表结构.建立合理的索引.设计合理的查询.库表结构包括如何设计表之间的关联.表字段的数据类型等.这需要依据具体的场景进行设计.如下 ...
- Mysql数据库性能优化(一)
参考 http://www.jb51.net/article/82254.htm 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要 ...
- 170727、MySQL查询性能优化
MySQL查询性能优化 MySQL查询性能的优化涉及多个方面,其中包括库表结构.建立合理的索引.设计合理的查询.库表结构包括如何设计表之间的关联.表字段的数据类型等.这需要依据具体的场景进行设计.如下 ...
- MySQL 数据库性能优化之缓存参数优化
在平时被问及最多的问题就是关于 MySQL 数据库性能优化方面的问题,所以最近打算写一个MySQL数据库性能优化方面的系列文章,希望对初中级 MySQL DBA 以及其他对 MySQL 性能优化感兴趣 ...
- DB-MySQL:MySQL 语句性能优化
ylbtech-DB-MySQL:MySQL 语句性能优化 1.返回顶部 1. MySQL概述1.数据库设计 3范式2.数据库分表分库---会员系统() 水平分割(分页如何查询)MyChar .垂直3 ...
- MySQL“被动”性能优化汇总!
年少不知优化苦,遇坑方知优化难. --村口王大爷 本文内容导图如下: 我之前有很多文章都在讲性能优化的问题,比如下面这些: <switch 的性能提升了 3 倍,我只用了这一招!> < ...
- 1229【MySQL】性能优化之 Index Condition Pushdown
转自http://blog.itpub.net/22664653/viewspace-1210844/ [MySQL]性能优化之 Index Condition Pushdown2014-07-06 ...
随机推荐
- connection to sys should be as sysdba or sysoper 解决的方法
连接时提示: 出现了例如以下的情况:EXP-00056;遇到ORACLE错误28009. ORA-28009:connection to sys should be as sy ...
- Centos下运行cp命令式提示略过目录
今天在复制一个目录到还有一个目录的时候cp ./res /usr 的时候出现了问题,提示我的是: cp略过了目录 后来我找了一下 在网上search了一下CP命令的使用方法: CP命令 该命令的功能是 ...
- linux进程、调度、线程、进程上下文等几点理解
1.信号来自进程或内核 2.线程共享进程的代码空间和数据空间(全局变量或静态变量),文件描述符,信号,以及malloc分配的内存,每个线程拥有独立的栈空间和程序计数器,在创建线程时,调用pthread ...
- Eclipse上传代码到GitHub
平时工作学习中难免会在Github搜索一下开源的Android代码, Android系统本身的代码就是托管在GitHub上,如果平时随手做了一个Demo,托管在云盘感觉不入流,如果平时自己一时兴起写了 ...
- 【右滑返回】滑动冲突 Scroller DecorView
基本思想 我们的滑动逻辑主要是利用View的scrollBy() 方法, scrollTo()方法和Scroller类来实现的 当手指拖动视图的时候,我们监听手指在屏幕上滑动的距离 利用View的sc ...
- PowerDesigner导入SQL脚本
方法/步骤 打开PowerDesigner,鼠标单击File菜单: 选择:Reverse Enginer,然后在他的子菜单选择Database...; 选择好DBMS(数据库管理系统) ...
- 《TCP/IP具体解释卷2:实现》笔记--接口层
接口层包含在本地网上发送和接收分组的硬件与软件. 我们用设备驱动程序来表示与硬件及网络接口通信的软件,网络接口是指在一个特定网络上硬件与设备驱动器之间的接口. Net/3接口层试图在网络协议和连接到一 ...
- Oracle中的数值处理方法
求绝对值函数 ) from dual; 求平方根函数 ) from dual; 求幂函数 ,3) from dual; 求余弦三角函数 select cos(3.14159) from dual; 求 ...
- 网络结构设计——负载均衡之LVS学习笔记(三)
LVS按个人理解的说就是将一台Linux服务器当作路由器等功能的技术.LVS---Linux虚拟服务器. LVS实现了三种IP负载均衡技术VS/NAT.VS/TUN.VS/DR. 今天简单分享一下我在 ...
- Spark性能优化:数据倾斜调优
前言 继<Spark性能优化:开发调优篇>和<Spark性能优化:资源调优篇>讲解了每个Spark开发人员都必须熟知的开发调优与资源调优之后,本文作为<Spark性能优化 ...