mysql性能优化以及配置连接参数设置


Posted in MySQL onMay 06, 2022

1 前言

在java开发中,最常用的数据存储就是数据库,其中常用的就是mysql,关于数据库的连接配置信息,可能就不是那么的清除了,这里做一个配置信息的说明。

2 数据库连接配置信息

jdbc:mysql://localhost:3306/database_name?serverTimezone=Asia/Shanghai&useUnicode=true&
characterEncoding=utf8&useSSL=false&tinyInt1isBit=true&allowMultiQueries=true&
rewriteBatchedStatements=true&useAffectedRows=true&defaultFetchSize=10000&
zeroDateTimeBehavior=convertToNull

3 配置信息说明

  • 1、serverTimezone=Asia/Shanghai,即时区设置,上海时间即东八区,高版本的mysql需要设置为 GMT%2B8(GMT+8)
  • 2、useUnicode=true 使用unicode 编码
  • 3、characterEncoding=utf8 数据库连接字符集
  • 4、useSSL=false 是否使用 ssl
  • 5、tinyInt1isBit=true 转换为 tinyint(1) 转换为 boolean ,否则为 int
  • 6、allowMultiQueries=true 是否允许多行查询,在批量更新数据时,update 语句使用分号(;)进行连接,此时则需要配置运行多行查询。
  • 7、rewriteBatchedStatements=true 批处理时需要设置该参数,在mysql5.1.13以上版本才能使用,对 update/insert/delete 都可以生效。数据量大时,消耗时间 jdbc batch < mybatis batch < foreach 循环。
  • 8、useAffectedRows=true,默认为false。是否使用影响行数,默认为找的所有修改行数,即false。在update 的情况下,更新3条,如果只有两条有变化,则返回2(useAffectedRows=true),否则返回3.
  • 9、defaultFetchSize=10000 默认获取条数
  • 10、zeroDateTimeBehavior=convertToNull 默认时间转换为null,避免转换报错。0000-00-00 时间转换为 null 

4 数据库sql

# 正常的插入数据
insert into table_name
# 如果数据存在则忽略,否则进行插入
insert ignore into table_name
# 如果数据存在则更新
insert into table_name (id,name) values(1,'小明') ON DUPLICATE KEY UPDATE id = 1,name = "xiaoming"
# 如果存在则替换
replace into table_name
# mysql 还有计算功能
select 1 + 4 # 计算结果为 5
# ifnull 如果字段为空则赋默认值为 0
select ifnull(age,0) from table_name
# 正则查询 user_no 不包含 数字
SELECT * FROM table_name  WHERE user_no REGEXP '[^0-9]'
# 时间处理
select
  DATE_FORMAT(create_time, '%Y%m%d %T'), -- 20210204 12:00:00
  id,
  DATE_FORMAT(create_time, '%Y%m%d%H') as time_str, -- 2021020412
  DATE_FORMAT(create_time, '%Y%m%d') as day_str,  -- 20210204
  DATE_FORMAT(create_time, '%H') as hour_str,  -- 12
  WEEKDAY(create_time) as week_str  -- 0-6,分别是 周一到周日
from
  table_name

5 mysql 性能优化的关注点

其实,mysql 性能优化不是简单的知道和使用 explainshow profile就天下无敌了,这两个只是重要的方面,何况作为资深的CRUD工程师还未必经常使用,任何的知识都是了解->熟悉->精通,当真正的了解原理或者系统的掌握才是真正的悟道。接下来开始进入正题,mysql又能优化主要为4个方面:

  • 1 硬件资源和操作系统方面的优化
  • 2 架构设计方面的优化
  • 3 mysql服务配置项的优化
  • 4 sql执行层面的优化

6 硬件和操作系统方面的优化

硬件和操作系统就是指mysql服务所运行的服务器硬件资源情况,影响mysql性能的主要因素分为 cpu 、内存大小、磁盘读写速度、网络带宽,硬件是指操作系统的网络配置和系统文件句柄数设置(linux 系统中,一切皆文件,了解过ES搭建的同学都知道,ES的搭建就需要修改系统最大打开的文件数) ,这部分的优化一般由运维工程师和DBA联合完成,在项目开发伊始,可以根据业务需要承载的数据量和 TPS 要求根据经验,考虑后续的业务扩展性,选择与业务相适配的mysql服务。

7 架构设计方面的优化

mysql是一个磁盘io访问频繁的关系型数据库,在高并发和高性能的应用场景中会承受巨大的压力,可以采取以下措施来应对:

  • 1 搭建mysql主从集群,单个mysql服务一旦宕机,将会导致依赖mysql服务的应用无法响应导致服务不可用,可以采用采用主从集群或者主主集群避免单点故障,保障mysql服务的高可用性。
  • 2 读写分离设计,在读多写少的场景中,可以采用读写分离的方案避免读写冲突导致的性能问题。
  • 3 采用分库分表的设计。通过分库可以降低单个mysql服务器的io压力,通过分表的机制可以降低单表数据量,提高sql的查询效率。
  • 4 热点数据引入Nosql。引入Redis或者MongoDB等非关系型数据库,可以缓解mysql的访问压力,提升数据的检索性能。

8 mysql 程序配置优化。

mysql配置文件的优化,一般通过 mysql配置文件my.cnf来设置。配置项一般包括:

  • mysql的最大连接数max_connections(注意这里说的不是项目中设置的数据库连接池的连接数)
  • 最大的传输包(max_allowed_packet = 16M
  • 开启 bin log(默认不开启,主要用在 mysql 同步的场景中)
  • general log(通用日志记录 sql 的执行记录)来记录日志
  • 还有就是缓冲区(buffer pool), 包括: 关联查询缓冲区 join_buffer_size=128M, 读数据缓冲区read_buffer_size=16M,随机读缓冲区read_rnd_buffer_size=32M,排序数据缓冲区 sort_buffer_size=32M, innodb 数据缓冲区innodb_buffer_pool_size=4G

这些参数的配置一般和服务器的资源和使用场景有关,需要根据实际情况来设置。配置项的修改需要关注两个点,一是配置的作用范围,分为会话级别和全局范围,全局参数对已经存在的会话不会生效,会话参数设置只在当前会话生效,会话结束则配置失效,全局类的配置放在默认的配置文件中,否则服务重启将会失效。第二是否支持热加载

9 sql 执行层面优化

sql执行层面优化的要点如下:

  • 1 慢sql查询分析,通过慢sql查询日志和慢sql查询分析工具来定位有问题的sql列表
  • 2 执行计划。通过explain 关键字 + 慢 sql查看当前sql的执行计划,需要重点关注select_type、type、 key、 rows、 filterd、 possible_keys来分析 sql 慢的原因.
  • 3 使用show profile工具来分析,该工具是mysql提供的分析当前会话中sql语句资源消耗情况的工具,可以用于sql调优的测量,当前会话中默认是关闭的状态,需要根据情况打开,默认保存最近 15 次的分析结果,针对慢sql可以通过show profile工具来进行详细分析,得到整个过程中所以资源的开销情况,比如io开销cpu开销和内存开销等情况

10 最终总结

  • 1sql的查询一定要根据索引来进行数据扫描
  • 2 避免查询列上使用函数运算或者运算符,避免索引失效
  • 3where条件语句中like %好尽量放置在右边
  • 4 使用索引扫描,联合索引的列从左往右,命中的越多越好
  • 5sql语句的排序字段尽量是索引字段,否则会开辟空间进行结果排序
  • 6 查询语句避免使用*号,使用需要查询的列信息即可。
  • 7 关联查询或者子查询使用小结果集驱动大结果集。

到此这篇关于mysql性能优化以及配置连接参数设置的文章就介绍到这了!


Tags in this post...

MySQL 相关文章推荐
MySQL kill不掉线程的原因
May 07 MySQL
MySQL COUNT函数的使用与优化
May 10 MySQL
简单了解 MySQL 中相关的锁
May 25 MySQL
MySQL 如何设计统计数据表
Jun 15 MySQL
分析mysql中一条SQL查询语句是如何执行的
Jun 21 MySQL
MySQL query_cache_type 参数与使用详解
Jul 01 MySQL
MySQL中B树索引和B+树索引的区别详解
Mar 03 MySQL
分享MySQL常用 内核 Debug 几种常见方法
Mar 17 MySQL
MySQL事务操作的四大特性以及并发事务问题
Apr 12 MySQL
SQL语句中EXISTS的详细用法大全
Jun 25 MySQL
MySQL事务的ACID特性以及并发问题方案
Jul 15 MySQL
MySQL新手入门进阶语句汇总
Sep 23 MySQL
Mysql InnoDB 的内存逻辑架构
详细介绍MySQL中limit和offset的用法
May 06 #MySQL
MySQL数据库Innodb 引擎实现mvcc锁
May 06 #MySQL
讲解MySQL增删改操作
May 06 #MySQL
解决Mysql报错 Table 'mysql.user' doesn't exist
MYSQL常用函数介绍
May 05 #MySQL
MySQL 数据 data 基本操作
May 04 #MySQL
You might like
全世界最小的php网页木马一枚 附PHP木马的防范方法
2009/10/09 PHP
getJSON跨域SyntaxError问题分析
2014/08/07 PHP
深入理解php printf() 输出格式化的字符串
2016/05/23 PHP
Yii2.0表关联查询实例分析
2016/07/18 PHP
详解PHP 二维数组排序保持键名不变
2019/03/06 PHP
判断脚本加载是否完成的方法
2009/05/26 Javascript
关于javascript中的parseInt使用技巧
2009/09/03 Javascript
javascript模拟select,jselect的方法实现
2012/11/08 Javascript
节点的插入之append()和appendTo()的用法介绍
2014/01/13 Javascript
jquery原创弹出层折叠效果点击折叠弹出一个层
2014/03/12 Javascript
2则自己编写的jQuery特效分享
2015/02/26 Javascript
谈谈JSON对象和字符串之间的相互转换JSON.stringify(obj)和JSON.parse(string)
2015/10/01 Javascript
基于jquery实现轮播特效
2016/04/22 Javascript
Vue2.0 组件传值通讯的示例代码
2017/08/01 Javascript
JS写谷歌浏览器chrome的外挂实例
2018/01/11 Javascript
angular2中Http请求原理与用法详解
2018/01/11 Javascript
express + jwt + postMan验证实现持久化登录
2019/06/05 Javascript
微信小程序 如何保持登录状态
2019/08/16 Javascript
关于vue路由缓存清除在main.js中的设置
2019/11/06 Javascript
[04:12]第二届DOTA2亚洲邀请赛选手传记-Newbee.Sccc
2017/04/03 DOTA
简单讲解Python中的数字类型及基本的数学计算
2016/03/11 Python
python数据清洗系列之字符串处理详解
2017/02/12 Python
Python 专题一 函数的基础知识
2017/03/16 Python
python数据结构链表之单向链表(实例讲解)
2017/07/25 Python
Python利用itchat对微信中好友数据实现简单分析的方法
2017/11/21 Python
Pyqt5 基本界面组件之inputDialog的使用
2019/06/25 Python
如何使用python3获取当前路径及os.path.dirname的使用
2019/12/13 Python
Python scrapy增量爬取实例及实现过程解析
2019/12/24 Python
python实现简单的购物程序代码实例
2020/03/03 Python
python如何实现word批量转HTML
2020/09/30 Python
使用html5新特性轻松监听任何App自带返回键的示例
2018/03/13 HTML / CSS
canvas实现手机的手势解锁的步骤详细
2020/03/16 HTML / CSS
Travelstart沙特阿拉伯:廉价航班、豪华酒店和实惠的汽车租赁优惠
2019/04/06 全球购物
成立公司计划书
2014/05/07 职场文书
交通处罚决定书
2015/06/24 职场文书
Redis之RedisTemplate配置方式(序列和反序列化)
2022/03/13 Redis