MySQL数据库查询性能优化的4个技巧干货
作者:IT学习日记v 发布时间:2024-01-13 23:25:16
前言
MySQL性能优化是一个老生常谈的问题,无论是在实际工作中还是面试中,都不可避免遇到相应的场景,下面博主就总结一些能够帮助大家解决这个问题的小技巧。
SQL优化之前需要确认哪些SQL需要优化,这时就需要引起SQL性能分析工具,主要优化的是查询语句。
SQL的执行频率
SQL性能优化一般是针对查询语句,所以在定位是否需要优化之前,可以先确认表的更删查改的一个执行频率对比,如果是查询占主导地位,则可以一步排查。
MySQL支持客户端通过show [session|global] status命令对服务器状态进行查询。
查看执行频率方式:
show global status like ‘com_______’(7个下划线,表示后面会有7个字符)
慢查询日志
确认了SQL的执行频率,则需要通过慢查询日志进行进一步定位哪些SQL语句执行时间占用较长。
慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认是10s)的所有SQL语句的日志。
默认情况下,慢查询日志是没有开启的,需要在MySQL的配置文件(linux下为:/etc/my.cnf)中配置如下指令:
查询服务端是否开启慢查询日志:show variables like 'slow_query_log';
在mysql的配置文件中添加如下配置启动:
slow_query_log=1;开启mysql慢日志查询开关
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详情分析
通过慢查询日志,我们可以定位到超过设置阈值的慢SQL,但是实际业务中,这并不能完全具有代表性,因为阈值是主观设置的,可能有大量执行时间低于阈值的SQL也存在问题,因此慢日志SQL并不能完全定位出所有的慢SQL。
show profiles 能够让我们了解到SQL执行时时间都耗费到哪里了。 通过have_profiling参数,可以查看mysql是否支持该profile操作。
格式: select @@have_profiling;
默认情况下,profiling是关闭的,可以同set指令开启session|global级别的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执行计划
前面介绍的几种方式都是通过执行时间长短来判断SQL语句执行的性能好坏,但是这个相对来说是比较片面的,想要更全面地评判SQL语句好坏,则需要使用explain查看SQL的执行计划。
Explain或者DESC命令获取MySQL如何执行SELECT语句的信息,包括在SELECT语句过程中表如何连接和连接的顺序。
语法:explain | desc select xxxx...
1、ID参数
select中的查询序号,表示的是查询中执行select子句或者是操作表的顺序(id相同,执行顺序从上往下,id不同,值越大,越先执行)
2、select_type参数
表示select查询类型,常见的有SIMPLE(简单表,即不使用表连接或者子查询)、primary(主查询,即外层查询)、UNION(UNION中的第二个或者后面的查询语句)、SUBQUERY(SELECT/WHERE之后包含了子查询)
3、type参数
表示连接/访问类型,性能由好到差的连接类型为:null、system、const、eq_ref、ref、range、index、all
在优化的时候,尽量将type往前优化,最差也要为index
null:查询的时候不访问任何表,如:select "1"
system:当访问一些系统表的时候会出现
const:根据主键或者唯一索引访问时,会出现const
eq_ref:待确认
ref:使用非唯一性索引进行访问时,可能出现ref
range:
index:使用到了索引,但是对整个索引都进行了遍历,性能也比较差
all:全表扫描,性能最差
4、possible_key参数:显示在执行查询时,表中可能被使用到的索引,一个或者多个、
5、key参数:在执行查询时,实际上会命中的索引
6、key_len参数:表示使用到的索引的字节数,该值为索引字段最大可能长度,在不损失精确性的前提下,长度越短越好。
7、rows参数:MySQL认为必须要执行查询的行数,在idb引擎表中,是一个估计值,可能并不总是准确的
8、ref参数:待确认?
9、filtered参数:表示查询返回的行数占总读取行数的百分比,值越大越好
10、extra参数:额外的一些执行信息如排序
来源:https://juejin.cn/post/7126184944379887646


猜你喜欢
- 增加中间件可以选择普通模式和LUA脚本模式,建议选择普通模式,实际上不需要控制的那么精确。package Middlewaresimport
- 本次做一个最简单的贪食蛇雏形游戏,就是一个小蛇在画面上移动,我们可以控制蛇的移动方向,但是不能吃东西,蛇不会长大。但是基础的有了,完整版的贪
- 需求小编通常会上一些专业的视频网站比如腾讯视频、优酷,在上面看电影、电视剧。这些网站有个优点,可以缓存视频,在通勤路上比如地铁就可以愉快的刷
- 一 开发环境集成开发工具:jupyter notebook 6.2.5集成开发环境:python 3.10.6第三方库:nump
- PHP计算字符串用strlen()只能得到字符串长度,不是宽高像素,使用到了php函数ImageTTFBBox(),就可以根据字体的大小和所
- 1. apply与transform首先讲一下apply() 与transform()的相同点与不同点相同点:都能针对dataframe完成
- Git 代码管理工具,类似 SVN 客户端。安装步骤:1、官网下载Git:https://gitforwindows.org/2、双击运行,
- ①.页面文件使用正确的编码,gb2312使用ANSI,utf-8使用utf-8; ②.ASP代码中设置正确的CODEPAGE,gb2312使
- js中报404是经常出现的问题,下列是一些高频原因;<script src="${pageContext.request.c
- 字符串的表示方式单引号 ' '双引号 " "多引号 """ "&
- 需求查询某个字段的时候需要给一个字段同样的值。这个值你可以写死,也可以从数据库获取1、写死值SELECT mfr_id AS mfrId,
- 关于excel多个sheet的导入导出import pandas as pddf = pd.read_excel('test.xls
- 如下所示:import pandas as pddata = pd.read_excel('123.xls','Sh
- FTP即文件传输协议;它基于客户机-服务器模型体系结构,应用广泛。它有两个通道:一个命令通道和一个数据通道。命令通道用于控制通信,数据通道用
- 异步编程一直是JavaScript 编程的重大事项。关于异步方案, ES6 先是出现了 基于状态管理的 Promise,然后出现了 Gene
- 导入相关包import timeimport pydashimport base64import requestsfrom lxml imp
- 1. 背景:最近写了一篇CSDN博客需要上传gif图,发现大小超过了5M,无法上传。文件大小:本想自己找个免费的压缩工具,结果下载下来的工具
- 前言出发点,网上下了一批png,使用wxFormBuilder做软件工具栏的图标,原图做出来的效果这么大的一个图标让笔者差点就笑岔气了以前都
- 本文实例为大家分享了Python KNN分类算法的具体代码,供大家参考,具体内容如下KNN分类算法应该算得上是机器学习中最简单的分类算法了,
- 今天又帮女朋友处理了一下,她的实验数据,因为python是一年前经常用,最近找工作,用的是c,c++,python的有些东西忘记了,然后就一