MySQL 数据库规范--调优篇(终结篇)
前言
这篇是MySQL 数据库规范的最后一篇--调优篇,旨在提供我们发现系统性能变弱、MySQL系统参数调优,SQL脚本出现问题的精准定位与调优方法。
目录
1.MySQL 调优金字塔理论
2.MySQL 慢查询分析--mysqldumpslow、pt_query_digest工具的使用(SQL脚本层面)
3.选择合适的数据类型
4.去除无用的索引--pt_duplicate_key_checker工具的使用(索引层面)
5.反范式化设计(表结构)
6.垂直水平分表
7.MySQL 重要参数调优(系统配置)
1.MySQL 调优金字塔理论
如下图所示:
![](http://upload-images.jianshu.io/upload_images/2836699-3363242bf7580f28.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700)
如上图所示:
数据库优化维度有四个:
硬件、系统配置、数据库表结构、SQL及索引
优化成本:
硬件>系统配置>数据库表结构>SQL及索引
优化效果:
硬件<系统配置<数据库表结构<SQL及索引
2.MySQL 慢查询分析
对于系统中慢查询的分析,有助于我们更高效的定位问题,分析问题。
mysqldumpslow、pt_query_digest是进行慢查询分析的利器。
前置条件
1.查看本机MySQL Server 慢查询是否打开
show variables like 'slow%';
慢查询打开的情况如下所示:
![](http://upload-images.jianshu.io/upload_images/2836699-eb93f762efa27fad.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700)
若慢查询未打开则通过如下脚本设置慢查询:
set global slow_query_log = on;
即
set global [上图中选项] = [你要设置的参数值]
注意 slow_query_log_file 路径要加单引号,因为路径varchar 类型的。
2.1 mysqldumpslow分析慢查询
mysqldumpslow 是MySQL自带的分析数据库慢查询的原生利器,使用方法如下:
mysqldumpslow -t 3 /data/mysql/log/mysql_slow_query.log | more \G;
-t 3 显示前3条慢查询。
慢查询信息及分析
![](http://upload-images.jianshu.io/upload_images/2836699-4f7340f695552373.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700)
但是 mysqldumpslow 显示的信息比较少,比如说此条sql执行次数在整体的执行次数中占用的百分比。类似于上述信息在 mysqldumpslow 的分析结果中是不存在的。
接下里我们介绍另一种工具 pt_query_digest
2.2 pt_query_digest分析慢查询
之所以使用 pt_query_digest 工具对慢查询日志进行分析,主要原因是上述工具分析的内容更佳丰富,更加方便我们分析慢查询。
前置条件
安装 pt_query_digest ,Google搜索应该一大把。
确保 pt_query_digest 安装成功 执行如下操作:
pt-query-digest /data/mysql/log/mysql_slow_query.log > slow_log.report
上述命令表示分析本机慢查询,并输出报表(文件)
接下来分析生成的报表:
tail slow_log.report
按如下图所示信息:
![](http://upload-images.jianshu.io/upload_images/2836699-5b92a18382f50903.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700)
我们对以上红色框图标记的报表信息进行详细描述,事实上这也是我们需要掌握的重点:
1.pct :sql语句某执行属性占所有慢查询语句某执行属性的百分比
1.total:sql语句某执行属性的所有属性时间。
2.Count:sql语句执行的次数,对应的pct 表示此sql 语句执行次数占所有慢查询语句执行次数的%比。上图为25%,total:表示总共执行了1次。
3.Exec time:sql执行时间
4.Lock time:sql执行期间被锁定的时间
5.Rows sent:传输的有效数据,在select 查询语句中才有值
6.Rows examine:总共查询的数据,非目标数据。
7.Query_time distribution:查询时间分布
8.SQL 语句:上图中为 select * from payment limit 10\G;
举例说明:加入某执行次数(count) 占比较高的sql语句,执行时间很长,Rows sent 数值很小,Rows examine 数值很大则表明(I/O较大)。那就表明有可能 sql 查询语句走了全表扫描,或者全索引扫描。那么就要建立合适索引或者优化sql语句了。
如下很好的展示了我们在分析慢查询时需要着重分析的三点:
![](http://upload-images.jianshu.io/upload_images/2836699-7c1e193809259e48.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700)
3.选择合适的数据类型
可以参考MySQL开发规范--设计篇中的1.6 数据表设计与规划
如下图是常用字段类型的选择建议:
![](http://upload-images.jianshu.io/upload_images/2836699-edc69b3a3506de2f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700)
4.去除无用的索引--pt_duplicate_key_checker工具的使用(索引层面)
此工具可以分析选定的 database 中的所有表中建立的index 中可能重复的索引,并给出了删除建议。
5.反范式化设计(表结构)
关于范式的理解,请参考--MySQL 数据库规范--设计篇1.1 数据库表的设计范式(三范式&反范式)
先看一个不满足第三范式的数据表设计:
![](http://upload-images.jianshu.io/upload_images/2836699-d7a5a33837f9cf23.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700)
不满足第三范式产生的问题:
假如将表中属于饮料分类的数据全部删除了,那么饮料分类也就不存在了,饮料的分类描述也就没了,查询不到了。这明显是不合理的。
重点:满足第三范式要求非键属性之间没有任何依赖关系,上图中分类与分类描述存在直接依赖关系。所以不符合第三范式的要求,那么要让表符合第三范式需要怎样做呢?
拆分后满足第三范式的表:
![](http://upload-images.jianshu.io/upload_images/2836699-c725007ff52e6850.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700)
我们采用一张 分类--商品名称 中间表来充当分表之后的中间桥梁。
当然如果一直遵循范式化设计,什么设计都向第三范式靠拢,当查询需要连接很多表的时候,建立索引已经起不到什么作用了,因为字段都不在同一张表中,所以建立索引是无用功,那么就要考虑反范式化的设计了。
6.垂直、水平分表
原则上当表中数据记录的数量超过3000万条,再好的索引也已经不能提高数据查询的速度了,这时候就需要将表拆分成更多的小表,来进行查询。
分表的机制有两种:
垂直分表:也就是将一部分列割裂开将数据放置在新设置的表中,优先选择字段值长度较长,类型较重的字段进行垂直分离。
水平分表:将表中数据水平切分,可以按照范围、取模运算、hash运算进行数据切割,每张表的结构信息都是一样的。
7.MySQL 重要参数调优(系统配置)
7.1 操作系统配置优化
![](http://upload-images.jianshu.io/upload_images/2836699-6e0ca72ccb22c2fb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700)
![](http://upload-images.jianshu.io/upload_images/2836699-fbecd28a3290e863.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700)
简要介绍一下:
1.tcp连接配置,超时时间配置
2.linux上文件打开数量限制
3.除此之外,最好在MySQL 服务器上关闭iptables,selinux 等防火墙软件。
7. 2 MySQL 配置文件优化
MySQL 可以通过启动时制定配置参数和使用配置文件两种方法进行配置,在大多数情况下配置文件位于/etc/my.cnf或是/etc/mysql/my.cnf MySQL查找配置文件顺序可以通过以下方法获得:
$ /usr/sbin/mysqld --verbose --help | grep -A 1 'Default options'
注意:如果多个位置存在配置文件,后面的会覆盖前面的
7.2.1 innodb_buffer_pool_size
innodb_buffer_pool_size 是非常重要的一个参数,用户配置Innodb 的缓冲池大小。如果数据库中只有Innodb表,则推荐配置量为总内存的75%。
一般情况下运行如下命令,即可获得配置innodb_buffer_pool_size 参数的最佳值:
select engine round(sum(data_length+index_length)/1024/1024,1) as
'total MB' from information_schema.tables where table_schema not in ("information_schema","performance_schema") group by engine;
Innodb_buffer_pool_size > Total MB;
7.2.2 innodb_buffer_pool_instance
MySQL 系统中有一些资源是需要独占使用的,比如缓冲去就是这样一种资源,因此如果系统中只有一个缓冲池,那么会增加阻塞的几率。我们多分成多个,则可以增加并发性能。
7.2.3 innodb_log_buffer_size
innodb log缓冲的大小,设置大小只能能容得下1s中产生的事务日志就可以。
7.2.4 innodb_flush_log_at_trx_commit
关键参数,对innodb 的I/O影响很大。默认值为1,可以去0,1,2三个值,一般建议为2,但如果数据安全性要求较高则默认使用1。
- 0:每隔1s中才将事务提交的变更记录刷新到磁盘
- 1:每一次事务提交都把变更日志刷新到磁盘(最安全的方式)
- 2:每一次提交将日志刷新到缓冲区,隔1s之后会将日志刷新到磁盘。
7.2.5 innodb_read_io_threads && innodb_write_io_threads
这两个参数决定了Innodb读写的I/O进程数,默认为4。
决定这两个参数数值的因素也有两个:cpu核数
、应用场景中读写事务比例
。
7.2.6 innodb_file_per_table
关键参数,默认情况下配置为off。
控制innodb每一个表使用独立的表空间,默认情况下,所有的表都会建立在共享表空间当中。
使用共享表空间会带来什么问题:
1.多个表对共享表空间的操作,是顺序进行的,这样的话操作效率在并发情况下回降低。
2.如果现在要删除一张表,会导致共享表空间先要将数据导出来,再重组。
7.2.7 innodb_stats_on_metadata
作用:决定了MySQL在什么情况下会刷新innodb表的统计信息。
保证数据库优化器能使用到最新的索引,但不能太频繁,一般设置为off。
作者:fxliutao
链接:https://www.jianshu.com/p/55020afb5eba
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
MySQL 数据库规范--调优篇(终结篇)的更多相关文章
- mysql数据库性能调优总结积累
mysql数据库的调优大概可以分为四大块 0 架构调优 ---根据业务 读写分库分表 ---主从 读写分离 1 配置的调优 ---开启缓存查询 设置缓存大小 ---最大连接数设置 ---数据库引 ...
- MySQL 数据库性能调优
MySQL 数据库性能调优 MySQL性能 最大数据量 最大并发数 优化的范围有哪些 存储.主机和操作系统方面: 应用程序方面: 数据库优化方面: 优化维度 数据库优化维度有四个: 优化选择: 数据库 ...
- mysql数据库索引调优
一.mysql索引 1.磁盘文件结构 innodb引擎:frm格式文件存储表结构,ibd格式文件存储索引和数据. MyISAM引擎:frm格式文件存储表结构,MYI格式文件存储索引,MYD格式文件存储 ...
- mysql 数据库缓存调优之解决The total number of locks exceeds the lock table size错误
环境: mysql5.6.2 主从同步(备注:需操作主库和从库) 一.InnoDB表执行大批量数据的更新,插入,删除操作时会出现这个问题,需要调整InnoDB全局的innodb_buffer_poo ...
- MYSQL数据库性能调优之八:mysql日志
MySQL日志 主要包含:错误日志.查询日志.慢查询日志.事务日志.二进制日志.中继日志: 使用 SHOW GLOBAL VARIABLES LIKE '%log%'; 查询所有日志配置详情: 一. ...
- MYSQL数据库性能调优之一:调优技术基础
1.mysql数据库优化技术有哪些? 2.数据库三层结构? 3.数据库3NF
- MYSQL数据库性能调优之四:解决慢查询--索引
为什么索引能够提高查询速度?没有索引 检索数据的方式是从头到尾一条一条挨着匹配,这是慢的根本原因:索引类型BTREE:二叉树类型,原理图如下:对表创建一个二叉树,记录中间数据的物理磁盘地址,二叉树检索 ...
- MYSQL数据库性能调优之七:其他(读写分离、分表等)
一.分表 水平划分 垂直划分 二.读写分离 三.选择合理的数据类型 特别是主键 四.文件.图片等大文件使用文件系统存储 五.数据库参数配置 注意:max_connections最大连接数一般设置在10 ...
- MYSQL数据库性能调优之五:解决慢查询--存储引擎与数据类型
3.数据类型的影响 4.存储引擎的影响 看你的mysql现在已提供什么存储引擎:mysql> show engines; 看你的mysql当前默认的存储引擎:mysql> show var ...
随机推荐
- Salesforce 应用生命周期管理
应用程序生命周期管理 一个Salesforce系统可以有多个版本,最常见的有: production版本:终端用户实际使用的版本 sandbox版本:沙盒环境,用于开发.测试等 在对Salesforc ...
- 关于在ROS kinetic下arbotix报错的问题
最近在学习ros过程中 出现了一个包错误 ERROR:cannot launch node of type [arbotix_python/arbotix_driver]:arbotix_pytho ...
- JMS Session session = connection.createSession(paramA,paramB) 两个参数不同组合下的含义和区别
Session session = connection.createSession(paramA,paramB); paramA是设置事务,paramB是设置acknowledgment mode ...
- win10升级后蓝牙不见了,设备管理器里没有,多了个串行控制器里的未知USB设备?
win10更新后,蓝牙功能不见了,也没有打开的选项,设备管理器里也没有,多了个未知USB设备,重启无效,重装蓝牙驱动无效,BIOS中的Bluetooth是开的. 试了网上能找到的所有方法,包括更新wi ...
- Unity Shader 基础(1): RenderType & ReplacementShader
很多Shader中都会定义RenderType这个类型,但是一直搞不明白到底是干嘛的,官方文档是这样结解释的:Rendering with Replaced Shaders Rendering wit ...
- TOPWAY智能彩色TFT液晶显示模块
TOPWAY 20年来专注工业显示, 以为全球工业用户提供稳定可靠和容易使用的液晶显示模块为己任, 智能彩色TFT液晶显示模块(以下简称智能模块), 就是我们在容易使用TFT 彩色液晶显示方向上为广大 ...
- Nginx使用教程(八):使用Nginx缓存之Memcached缓存
使用Memcache <br\>Memcache是一个通用的内存缓存系统. 它通常用于加速缓慢的数据访问. NGINXmemcached模块提供各种指令,可以配置为直接访问Memcache ...
- 使用Vuex心得
之前一直都是看别人写的vuex感觉还挺好理解的,今天自己根据需求写了下vuex,一下子不知道怎么写了, 想要用好vuex还是先要知道原理: 参考好博客写的非常到位:https://www.cnblog ...
- A - Packets 贪心
A factory produces products packed in square packets of the same height h and of the sizes 1*1, 2*2, ...
- Spring中事务配置以及事务不起作用可能出现的问题
前言:在Spring中可以通过对方法进行事务的配置,而不是像原来通过手动写代码的方式实现事务的操作,这在很大程度上减少了开发的难度,本文介绍Spring事务配置的两种方式:基于配置文件的方式和基于注解 ...