当前位置:网站首页>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语句优化
删除语句优化
写在最后
边栏推荐
- PostgreSQL V14中更好的SQL函数
- With 1000 lines of code statistics after the xi 'an housing prices, I have a startling discovery...
- SQL 不新增表 把一张表定义成两张
- 可视化数据库设计软件有哪些_数据库可视化编程
- 十大免费代理ip软件_国内静态ip代理软件
- varchar2 and varchar2(char)_datetime data types
- 【常见 error】Vivado 综合出现中断、失败、“PID not specified”
- 有希望就是好的
- 使用Typora+EasyBlogImageForTypora写博客,无图床快速上传图片
- 英文邮件总结
猜你喜欢
使用Jetty服务器和Axis2框架技术发布Webservice接口
MMA安装及使用优化
输出一个整数的二进制形式
彻底搞懂云桌面配置及实践踩坑【华为云至简致远】
Detailed explanation of cloud hard disk EVS and how to use and avoid pits [HUAWEI CLOUD is simple and far]
苹果开发「AI 建筑师」GAUDI:根据文本生成超逼真 3D 场景!
基于.NET 6 的开源访客管理系统
162_Power Query 快速合并文件夹中表格之自定义函数 TableXlsxCsv_2.0
R7 6800H+RTX3050+120Hz 2.8K OLED屏,无畏Pro15 2022开启预售
【实战】Next.js + 云函数开发一个面试刷题网站
随机推荐
Day2:面试必考题目
基于matlab的遥测信道的基本特性仿真分析
不安装运行时运行.NET程序
正则表达式入门二(普通字符)
你把 vite打包 玩明白
Php程序员用那个编辑器比较好?
WMS软件国内主要供应商分析
雷克萨斯lm的安全性如何,通过两个角度来聊这个话题
C语言中操作符的详细介绍
Chrome browser corresponding driver_chrome mobile browser
PAT乙级-B1014 福尔摩斯的约会(20)
基于ModelArts的动漫头像自动生成丨【华为云至简致远】
PAT乙级-B1015 德才论(25)
内心的需求
【实战】Next.js + 云函数开发一个面试刷题网站
一对多查询(分页)
PAT乙级-B1013 数素数(20)
地球自转加快
正则表达式入门一
PHP中高级面试题 – 第三天