当前位置:网站首页>MySQL性能优化的'4工具+10技巧'
MySQL性能优化的'4工具+10技巧'
2022-08-03 14:48:00 【InfoQ】
前言
SQL性能优化工具
一、SQL的执行频率
- show global status like ‘com_______’(7个下划线,表示后面会有7个字符)

二、慢查询日志
- 查询服务端是否开启慢查询日志:show variables like 'slow_query_log';
- 在mysql的配置文件中添加如下配置启动:
- 1、slow_query_log=1;开启mysql慢日志查询开关
- 2、long_query_time=xx;设置慢日志时间,只要SQL执行时间查过该值,则视为慢查询,记录在慢日志中。
- 配置完成后重启mysql服务端
- linux中mysql的慢日志文件在: /var/lib/mysql/localhost-slow.log
- window可以在my.ini文件中配置具体的地址,示例如下:


- Query_time:表示 SQL执行的时间,越长则越慢
- Lock_time:表示在MySQL服务器阶段(不是在存储引擎阶段)等待表锁时间
- Rows_sent:表示查询返回的行数
- Rows_examined:表示查询检查的行数
三、show profiles详情分析
- 格式: select @@have_profiling;

- 格式: set global | session profiling = 1;
- show profiles:查看每一条SQL的耗时基本情况
- show profile for query query_id:查询指定query_id的SQL语句各个阶段的耗时情况
- show profile cpu for query query_id:查询指定query_id的SQL语句cpu使用情况

四、explain执行计划
- 语法:explain | desc select xxxx...
- null:查询的时候不访问任何表,如:select "1"
- system:当访问一些系统表的时候会出现
- const:根据主键或者唯一索引访问时,会出现const
- eq_ref:类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件
- ref:使用非唯一性索引进行访问时,可能出现ref
- range:使用索引进行范围查询时
- index:使用到了索引,但是对整个索引都进行了遍历,性能也比较差
- all:全表扫描,性能最差

性能优化技巧
一、插入数据优化
- 批量插入(单条插入需要每次都与数据创建链接,存在比较大消耗)
- 手动管理事务(可以将批量多个批量插入放在一个事务中,减少开启、关闭事务次数)
- 数据按照主键顺序插入(避免页分裂和重新指针指向,下面会具体介绍这两者的概念)
- 大数据量时使用load指令(如初始化时需要几百甚至上千万数据(百万数据十几秒),此时则使用load命令来进行插入数据,mysql原生支持大数据量插入,性能非常高)
- 如果是命令行连接,需要指定客户端需要执行本地文件,在连接中添加:--local-infile
- 服务端开启load指令支持:set grobal local_infile=1
- 语法:load data local infile '文件路径' into table '表名' fields teminated by '字段分割符号' lines teminated by '行分割符号'

主键优化



- 满足业务需求情况下,尽量降低主键的长度(因为二级索引叶子节点存储的是主键值,主键值越长,占用的空间越大,在搜索时需要耗费磁盘IO的次数就越多)
- 插入数据时,尽量顺序插入,选择使用AUTO_INCREMENT自增主键(乱序插入可能导致页分裂,消耗性能)
- 尽量不要使用UUID做主键或者其他自然主键如身份证(因为它们是无序的,还是会存在页分裂,同时因为它们的长度也较长,在检索时会耗费大量的磁盘IO)
- 业务操作时,尽量避免对逐渐的修改(修改了主键,需要重新维护对应的索引数据结构)
二、查询优化
1、Order by优化
- 给对应的字段创建联合索引(注意要根据排序的顺序或者倒叙指定索引的顺序)
- 如果不可避免出现filesort,在对大数据量排序时,可以释放增加排序缓冲区大小sort_buffer_size(默认是256K),查询方式:show variables like 'sort_buffer_size'。
- 如果排序缓冲区被占满,则会在磁盘进行排序操作,性能会降低
2、group by优化
- Using temporary: 使用了临时表,性能较低
- Using index: 走了索引,性能提高(案例:group by 和where中字段满足最左前缀法则)
- Using index;Using temporary:案例如不遵循最左前缀法则,但是命中索引覆盖时,可能出现这个值
3、Limit优化

4、Count优化

- count(*): 对返回的数据进行计数。逻辑:引擎做了专门优化,不取值,服务层直接按行进行累加。
- count(主键):主键不可能为NULL,InnoDB会遍历全表、将每行的主键ID取出来,返回给服务层进行累计操作,无需判断是否为NULL。
- count(1):对返回的每条数据都置1,然后进行累计。逻辑:引擎遍历全表,但是不取值,服务层对返回的每一行都放一个数字"1"进去,直接进行累加操作。
- count(列):统计字段值不为NULL的条数。统计逻辑:没有not null约束,idb引擎会遍历全表的每一行的字段值取出来,返回给服务层,服务层会判断是否为null,不为null则进行累加。如果有not null约束,则引擎会遍历全表返回每一行的字段值,返回给服务层,服务层直接进行累加操作。

Update语句优化

删除语句优化
写在最后
边栏推荐
- PAT乙级-B1012 数字分类(20)
- PAT乙级-B1013 数素数(20)
- LeetCode136:只出现一次的数字
- MMA安装及使用优化
- NFT盲盒挖矿DAO智能合约dapp系统开发详情
- 未来无法预料
- JS每晚24:00更新某方法
- Detailed explanation of cloud hard disk EVS and how to use and avoid pits [HUAWEI CLOUD is simple and far]
- LARS (Least Angle Regression)
- Chrome browser corresponding driver_chrome mobile browser
猜你喜欢
eolink告诉你,国内Api行业,可以内卷到什么程度?
图形学-粒子系统 (Particle System)
网络通信的过程
System learning Shell regular expressions
MMA安装及使用优化
理解string类
C语言中操作符的详细介绍
Taurus.MVC WebAPI 入门开发教程1:框架下载环境配置与运行(含系列目录)。
[The Beauty of Software Engineering - Column Notes] 36 | What exactly do DevOps engineers do?
用1000行代码统计西安新房价格后,我有一个惊人的发现……
随机推荐
【指针内功修炼】函数指针 + 函数指针数组 + 回调函数(二)
自己悦表存心
地球自转加快
DeepLink在转转的实践
R7 6800H+RTX3050+120Hz 2.8K OLED screen, Intrepid Pro15 2022 pre-sale
你把 vite打包 玩明白
输出一个整数的二进制形式
【FPGA教程案例44】图像案例4——基于FPGA的图像中值滤波verilog实现,通过MATLAB进行辅助验证
云硬盘EVS详解以及如何用与避坑【华为云至简致远】
【问题】使用pip安装第三方库的时候遇到“timeout”的解决方法
苹果开发「AI 建筑师」GAUDI:根据文本生成超逼真 3D 场景!
正则表达式入门二(普通字符)
162_Power Query is a custom function for quickly merging tables in a folder TableXlsxCsv_2.0
内心的需求
【问题】torch和torchvision对应版本
想成为网络安全技术爱好者(可能是黑客)的话,需要看什么书?
基于matlab的遥测信道的基本特性仿真分析
使用域名注册服务 Domains配置域名【华为云至简致远】
PAT乙级-B1012 数字分类(20)
HDU 1160 FatMouse's Speed(最长递减子序列变形)