总结一些工作中碰到的点,会持续更新,有问题欢迎留言
sql调优
1:索引太多会影响插入效率,索引太多很可能是表设计不合理
2:索引尽量唯一,并且索引检索数据行尽量小
3:尽量设计统一字符集,表、字段字符集不一致索引不生效
4:锁表的问题基本上把update语句 where条件改为主键或者索引列就解决了
事务相关
1:尽量使用read commit隔离级别(很多乐观锁的场景我们需要retry,这个时候rc级别才能保证retry是有用的)
2:嵌套事务和隔离基本密切相关,不要看网上的文章。最好自己根据项目测试
3:事务包裹的方法尽量只处理数据库操作,防止大事务
数据库连接池
1:连接数要根据系统压测调优,正常情况不应该过大
2:show variables like ‘%timeout%’ 查看数据库配置超时时间等参数做对应的连接池配置
3:尽量配置固定大小的连接池,减少释放、创建连接的消耗。idle\max 参数设置一样,根据对应连接池配置做调整
4:获取连接超时基本都是慢sql导致,根据慢sql报表对sql做调优。
5:多线程的线程数尽量小,即使是io密集型业务,涉及到数据库操作也应该设置小于数据库连接池大小的最大线程数;否则也会存在拿不到数据库连接
jdbc连接串参数
1:allowMultiQueries=true;批量提交sql,一般用在批量更新场景并且更新字段不确定
2:rewriteBatchedStatements=true;允许jdbc批量发送指令
3:cachePrepStmts=true;减少重复编译
4:prepStmtCacheSize=250;缓存sql条数
5:prepStmtCacheSqlLimit=2048;缓存的字符数
很多导入的业务,一次导入上万条数据,批量提交数据过多执行效率会慢很多;
批量更新、新增的场景,建议200条左右做一次提交和prepStmtCacheSize长度有关;提交后要根据数据库性能做适当调整