mysql高并发插入慢

最近在对程序进行压力时,发现一个接口在高并发插入时,响应很慢,大概需要15秒左右。分析记录解决方案。

1、代码优化

发现接口实现类中有个地方做了代码同步控制synchorized,分析后感觉没必要就去掉了,性能提高到7秒左右,虽然提高了,大还是不行,进一步优化。

2、数据库配置修改

数据库安装时,没有修改任何配置,全部为默认配置,网上查询解决方案:

 1、sync_binloginnodb_flush_log_at_trx_commit 两个参数,这两个参数是控制MySQL 磁盘写入策略以及数据安全性的关键参数

image

于是修改这两个参数值,注意这样设置重启后将会失效!!!!

set global sync_binlog=500;  
set global innodb_flush_log_at_trx_commit=2;

2、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%,在my.ini中设置,重启mysql:

3、结束语

最后再进行压力测试,性能提高到1秒左右了。

### Java与MySQL高并发插入操作最佳实践 #### 数据库连接池配置 为了提高性能并减少资源消耗,在Java应用程序中应使用数据库连接池来管理到MySQL服务器的连接。合理设置最大活跃连接数、最小闲置连接数以及超时时间等参数可以有效提升系统的吞吐量和响应速度[^1]。 ```java HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:mysql://localhost:3306/test"); config.setUsername("root"); config.setPassword("password"); // 设置合理的连接池大小 config.setMaximumPoolSize(20); DataSource dataSource = new HikariDataSource(config); ``` #### 批处理插入语句 当执行大量数据写入时,采用批量提交的方式能够显著降低网络开销,并减轻数据库的压力。通过PreparedStatement预编译SQL语句,并利用addBatch()方法累积多条记录后再一次性发送给MySQL执行,可获得更好的效率。 ```java String sql = "INSERT INTO users (name, age) VALUES (?, ?)"; try (Connection conn = dataSource.getConnection()) { try (PreparedStatement pstmt = conn.prepareStatement(sql)) { for (int i = 0; i < batchSize; ++i) { pstmt.setString(1, names[i]); pstmt.setInt(2, ages[i]); pstmt.addBatch(); if ((i + 1) % batchLimit == 0 || i == batchSize - 1) { pstmt.executeBatch(); // 提交批次 } } } } ``` #### 使用事务控制 对于涉及多个表更新的操作场景下,开启显式的事务可以帮助保持数据的一致性和完整性。同时适当调整隔离级别可以在一定程度上缓解锁竞争带来的负面影响,从而优化整体性能表现。 ```sql START TRANSACTION; -- 多条DML语句... COMMIT; ``` #### 避免哈希映射作为查询结果类型 考虑到线程安全性和扩展性方面的要求,不建议直接将HashMap或HashTable用于存储来自数据库的结果集。推荐选用更合适的集合类如ArrayList或者专门设计的数据结构来进行封装处理[^3]。 #### 表结构设计考量 针对频繁发生的插入请求,应该仔细规划索引策略以平衡读取和写入之间的关系;另外还可以考虑分区技术(Partitioning),按照一定规则拆分大表成若干个小部分以便于管理和访问控制。 #### 字符编码注意事项 如果业务逻辑涉及到中文字符或者其他非ASCII码范围内的文字,则需要注意设定正确的字符集支持。例如`UTF8MB4`能更好地兼容表情符号等特殊字符而不丢失信息[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值