首页 > 数据库 >SQL性能分析手段

SQL性能分析手段

时间:2024-01-17 10:13:55浏览次数:30  
标签:性能 MySQL 查询 索引 手段 SQL query id SELECT

SQL执行频率

MySQL 客户端连接成功后,通过 show [session|global] status 命令可以提供整个服务器执行sql的状态信息。通过如下指令,可以查看当前数据库的INSERT、UPDATE、DELETE、SELECT的访问频次:

-- session 是查看当前会话 ;
-- global 是查询全局数据 ;
SHOW GLOBAL STATUS LIKE 'Com_______';

  • Com_delete: 删除次数
  • Com_insert: 插入次数
  • Com_select: 查询次数
  • Com_update: 更新次数

通过查看这些次数就能知道当前数据库以增删改为主,还是查询为主。

  • 如果是以增删改为主,我们可以考虑不对其进行索引的优化。
  • 如果是以查询为主,那么就要考虑对数据库的索引进行优化了(借助慢查询日志)

慢查询日志

慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志。

判断是否开启

MySQL的慢查询日志默认没有开启,我们可以查看一下系统变量 slow_query_log

开启

在MySQL的配置文件(/etc/my.cnf)中配置如下信息:

# 开启MySQL慢日志查询开关
slow_query_log=1
# 设置慢日志的时间为2秒,SQL语句执行时间超过2秒,就会视为慢查询,记录慢查询日志
long_query_time=2

接着重启MySQL

查看日志

[root@localhost mysql]# tail -f localhost-slow.log

  • Time:执行时间
  • User@Host:执行用户
  • Query_time:查询耗时

profile详情

帮助我们了解执行SQL具体耗时在哪个步骤

-- 查看是否支持 yes:支持
SELECT @@have_profiling ;

-- 查看开启状态 0:关闭、1:开启
 select @@profiling;

-- 开启
SET profiling = 1;
-- 查看每一条SQL的耗时基本情况
show profiles;

-- 查看指定query_id的SQL语句各个阶段的耗时情况(query_id根据以上命令得到)
show profile for query query_id;

-- 查看指定query_id的SQL语句CPU的使用情况
show profile cpu for query query_id;

explain

获取 MySQL 如何执行 SELECT 语句的信息,如:数据表的查询顺序、数据查询操作的操作类型、哪些索引可以被命中、哪些索引实际会命中、每个数据表有多少行记录被查询等信息

支持 SELECT、DELETE、INSERT、REPLACE 以及 UPDATE 语句。我们一般多用于分析 SELECT 查询语句

语法

-- 直接在select语句之前加上关键字 explain / desc
explain SELECT 字段列表 FROM 表名 WHERE 条件 ;

列名 含义
id select查询的序列号,表示查询中执行select子句或者数据表的顺序
(id相同,执行顺序从上到下;id不同,值越大,越先执行)
select_type 表示 SELECT 的类型,常见的取值:
1. SIMPLE(简单查询,即不使用表连接或者子查询)
2. PRIMARY(主查询,即最外层的 SELECTunion最左的select)
3. UNIONUNION 之后出现的 SELECT
4. SUBQUERY(子查询中的第一个 SELECT
5. DERIVED:在 FROM 中出现的子查询
6. UNION RESULTUNION 查询的结果
table 用到的表名
<unionM,N> : 本行引用了 id 为 M 和 N 的行的 UNION 结果;
<derivedN> : 本行引用了 id 为 N 的表所产生的的派生表结果。派生表有可能产生自 FROM 语句中的子查询。
<subqueryN> : 本行引用了 id 为 N 的表所产生的的物化子查询结果。
partitions 匹配的分区,对于未分区的表,值为 NULL
type 查询执行的类型,描述了查询是如何执行的,性能由好到差的连接类型为systemconsteq_refrefrangeindexall
system:如果表使用的引擎对于表行数统计是精确的(如:MyISAM),且表中只有一行记录的情况下,访问方法是 system ,是 const 的一种特例。
const:表中最多只有一行匹配的记录,一次查询就可以找到,常用于使用主键或唯一索引的所有字段作为查询条件,如 where id = 1这种。
eq_ref:主键索引或唯一索引与其他字段的关联查询,最多只返回一条记录,on xx.id = xxx.id
ref:使用普通索引作为查询条件,查询结果可能找到多个符合条件的行
range:对索引列进行范围查询,如where id>3这种,执行计划中的 key 列表示哪个索引被使用了。
index:查询遍历了整棵索引树,与 ALL 类似,只不过扫描的是索引,而索引一般在内存中,速度更快。
ALL:没有索引全表扫描。
possible_keys 执行查询时可能用到的索引
key 实际用到的索引
key_len 实际使用的索引的最大长度, 在满足需求的前提下越短越好
ref 与索引比较的列或常量
rows MySQL预估执行查询要读取的行数,不是结果集的行数,数值越小越好
filtered 表示返回结果的行数占需读取行数的百分比, filtered 的值越大越好
Extra 附加信息,更准确的理解 MySQL 到底是如何执行查询的
Using filesort:通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sortbuffer中完成排序操作,所有不是通过索引直接返回排序结果的排序
Using temporary:MySQL 需要创建临时表来存储查询的结果,常见于 ORDER BY 和 GROUP BY。
Using index:表明查询使用了覆盖索引,不用回表,查询效率非常高。
Using index condition:表示查询优化器选择使用了索引条件下推这个特性。
Using where:where后面没用到索引,此时可考虑添加索引。
Using join buffer (Block Nested Loop):连表查询的方式,表示当被驱动表的没有使用索引的时候,MySQL 会先将驱动表读出来放到 join buffer 中,再遍历被驱动表与驱动表进行查询。

标签:性能,MySQL,查询,索引,手段,SQL,query,id,SELECT
From: https://www.cnblogs.com/Acegzx/p/17969195

相关文章

  • 无涯教程-SQL - FULL JOIN函数
    SQLFULLJOIN组合了左右外部联接的输出,联接的表将包含两个表中的所有记录,并为任一侧缺少的匹配项填充NULL。FULLJOIN-语法FULLJOIN的基本语法如下-SELECTtable1.column1,table2.column2...FROMtable1FULLJOINtable2ONtable1.common_field=table2.common_fie......
  • SQL中的unix_timestamp()函数
    unix_timestamp()是SQL中用于将日期和时间转换为UNIX时间戳的函数。UNIX时间戳是指从1970年1月1日(UTC)开始的秒数。使用场景:时间戳转换:当你有一个日期和时间,并希望将其转换为UNIX时间戳格式时。数据整合:在数据整合过程中,你可能需要将来自不同源的数据统一到相同的......
  • Mysql死锁问题如何排查和解决
    Mysql查询是否存在锁表有多种方式,这里只介绍一种最常用的。1、查看正在进行中的事务SELECT*FROMinformation_schema.INNODB_TRX2、查看正在锁的事务SELECT*FROMINFORMATION_SCHEMA.INNODB_LOCKS;3、查看等待锁的事务SELECT*FROMINFORMATION_SCHEMA.INNODB_LOCK_......
  • MySQL的count(1),count(*),count(列名)的区别
    在MySQL中,`COUNT()`函数用于返回匹配特定条件的行数。以下是`COUNT()`函数中不同用法的区别:1.`COUNT(1)`:此用法中的参数可以是任何常数,不一定是1。这个用法会对结果产生很小的性能提升,因为它告诉MySQL不必去查找行的数据,只需要判断行是否存在即可。因为MySQL只需要判断是否有一......
  • SQLSERVER - 性能优化
    行存储和列存储行存储场景:数据维护,数据检索列存储场景:数据分析索引的了解聚集索引聚集索引中,叶节点包含基础表的数据页。数据链内的页和行将按聚集索引键值进行排序。主键通常是聚集索引,但可以不是聚集索引。非聚集索引基础表的数据行不会根据其非聚集键......
  • 无涯教程-SQL - RIGHT JOIN函数
    SQLRIGHTJOIN返回右表中的所有行,即使左表中没有匹配项也是如此,这意味着右连接返回右表中的所有值,再加上左表中的匹配值,如果没有匹配则返回NULL。RIGHTJOIN-语法RIGHTJOIN的基本语法如下。SELECTtable1.column1,table2.column2...FROMtable1RIGHTJOINtable2O......
  • mysql8.0详细安装
    Linux安装MySQL8.0.26超详细图文步骤 1、MySQL8.0.26下载官方网站下载MySQL8.0.26安装包,下载地址:https://downloads.mysql.com/archives/community/需要注意:Linux操作系统是32位还是64位,本案例采用Linux64位操作系统进行讲解,通过wget命令下载安装包。使用df-......
  • kettle从入门到精通 第三十一课 mysql 数据连接连接池配置
    无论开发应用程序还是做ETL研发,都离不开连接池的应用,如下是kettle中mysql连接池设置界面,今天重点讲解下连接池中的参数配置。defaultAutoCommit当defaultAutoCommit参数设置为true时,表示连接会自动提交每个单独的SQL语句,这意味着每个语句都将被当作一个独立的事务自动提交......
  • mysql8.0逻辑架构
    1、逻辑架构剖析1.1、服务器处理客户端请求首先MySQL是典型的C/S架构,即Client/Server架构‘,服务器端程序使用的mysqld。不论客户端进程和服务器进程是采用哪种方式进行通信,最后实现的效果都是:客户端进程向服务器进程发送一段文本(SQL语句),服务器进程处理后再向客户端进程发......
  • 无涯教程-SQL - Create Table Using another Table.函数
    可以使用CREATETABLE语句和SELECT语句的组合来创建现有表的副本。新表具有相同的列定义。可以选择所有列或特定列。当您使用现有表创建新表时,将使用旧表中的现有值填充新表。语法从另一个表创建表的基本语法如下:CREATETABLENEW_TABLE_NAMEASSELECT[column1,colu......