MySQL 10w+数据 insert 优化

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

转载声明:转载请注明出处,本技术博客是本人原创文章

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> MySQL 10w+数据 insert 优化

点击上方“后端技术精选”,选择“置顶公众号”

技术文章第一时间送达!

作者:殷天文 www.jianshu.com/p/09689e6cc2d6

www.jianshu.com/p/09689e6cc2d6

技术经验交流:

由于业务原因,遇到了如题所述的业务问题,事务执行时间在30s~50s 不等,效果非常不理想

方案1. jdbc批处理

5w+ 数据测试,分别使用了mybatis insert()()(拼接xml), mybatis的批处理和 jdbc的批处理。

可以看到在jdbc执行时间方面是差不多的,但是在方法执行时间上,批处理要稍微快了一些,但是还是不理想

MySQL 10w+数据 insert 优化

5w+ 数据测试1

MySQL 10w+数据 insert 优化

5w+ 数据测试2

方案2. 优化MySQL 参数

修改 my.ini

innodb_buffer_pool_size :

InnoDB, unlike MyISAM, uses a buffer pool to cache both indexes and row data. The bigger you set this the less disk I/O is needed to access data in tables. On a dedicated database server you may set this parameter up to 80% of the machine physical memory size. Do not set it too large, though, because competition of the physical memory may cause paging in the operating system. Note that on 32bit systems you might be limited to 2-3.5G of user level memory per process, so do not set it too high.

Innodb的缓冲池会缓存数据和索引,设置的越大访问表中的数据所需的磁盘I/O就越少。

修改innodb_buffer_pool_size = 512M测试一下效率,这速度简直感人!

MySQL 10w+数据 insert 优化

10w+数据测试1

innodb_log_buffer_size :

The size of the buffer InnoDB uses for buffering log data. As soon as it is full, InnoDB will have to flush it to disk. As it is flushed once per second anyway, it does not make sense to have it very large (even with long transactions).

表示InnoDB写入到磁盘上的日志文件时使用的缓冲区的字节数,默认值为8M。当缓冲区充满时,InnoDB将刷新数据到磁盘。由于它每秒刷新一次,所以将它设置得非常大是没有意义的 (即使是长事务)。

innodb_log_file_size :

Size of each log file in a log group. You should set the combined size of log files to about 25%-100% of your buffer pool size to avoid unneeded buffer pool flush activity on log file overwrite. However, note that a larger logfile size will increase the time needed for the recovery process.

该值越大,缓冲池中必要的检查点刷新活动就会越少,节省磁盘I/ O。但是越大的日志文件,mysql的崩溃恢复就越慢

设置上述两个参数innodb_log_file_size=64M innodb_log_buffer_size=16M,效率提升的并不明显。

MySQL 10w+数据 insert 优化

10w+数据测试2

总结

数据量大时,批处理在方法执行时间上要比 mybatis xml拼接快一点 (批处理只编译一条SQL,而拼接的方式SQL会很长)

性能瓶颈优化还是要从数据库下手,目前来看MySQL 大数据量时很依赖 innodb_buffer_pool_size (缓冲池)

参考

https://my.oschina.net/realfighter/blog/368225

(点击可跳转)

1. 

****2. ****

3. 

****4. ****

看到这里了,就关注一个呗

MySQL 10w+数据 insert 优化

原文始发于微信公众号(后端技术精选):

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

转载声明:转载请注明出处,本技术博客是本人原创文章

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> MySQL 10w+数据 insert 优化


 上一篇
腾讯面试——一条SQL语句执行得很慢的原因有哪些?—不看后悔系列 腾讯面试——一条SQL语句执行得很慢的原因有哪些?—不看后悔系列
说实话,这个问题可以涉及到 MySQL 的很多核心知识,可以扯出一大堆,就像要考你计算机网络的知识时,问你“输入URL回车之后,究竟发生了什么”一样,看看你能说出多少了。 之前腾讯面试的实话,也问到这个问题了,不过答的很不好,之前没去想
下一篇 
选择合适的 MySQL 日期时间类型来存储你的时间 选择合适的 MySQL 日期时间类型来存储你的时间
点击上方“Java知音”,选择“置顶公众号” 技术文章第一时间送达! 作者:zhuzhichao 原文地址:http://suo.im/5d3qii 推荐阅**读(点击即可跳转阅读)** 1.  **2. ** **3. *