mysql 基础(性能分析)explain

sql性能分析:
1.sql执行频率
show [session|global] status like 'Com_______';(7个_)

2.慢查询日志
慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认1O秒)的所有SQL语句的日志。
MySQL的慢查询日志默认没有开启,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:
开启MySQL慢日志查询开关
slow_query_log=1
设置慢日志的时间为2秒,SQL语句执行时间超过2秒,就会视为慢查询,记录慢查询日志
long_query_time=2
配置完毕之后,通过以下指令重新启动MySQL服务器进行测试,查看慢日志文件中记录的信息/var/lib/mysqL/localhost-slow.log。
同时可配置文件存储位置:slow-query-log-file=/usr/local/mysql/data/localhost-slow.log

3.profile详情
show profiles能够在做SQL优化时帮助我们了解时间都耗费到哪里去了。通过have_profiling:参数,能够看到当前MySQL是否支持
profile操作:
SELECT @@have_profiling;
默认orofiling:是关闭的,可以通过set语句在session/global级别开启profiling:
SET profiling 1;

执行一系列的业务SQL的操作,然后通过如下指令查看指令的执行耗时:
查看每一条SQL的耗时本情况
show profiles;

查看指定query id的SQL语句各个阶段的耗时情况
show profile for query query id;

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

4.explain执行计划
explain select * from user where uid=1

(1)id: select查询的序列号,表示查询中执行select子句或者是操作表的顺序(id相同,执行顺序从上到下;id不同,值越大,越先执行)。
多表关联查询


子查询时会出现id不同

(2)select_type
表示SELECT的类型,常见的取值有SIMPLE(简单表,即不使用表连接或者子查询)、PRIMARY(主查询,即外层的查询)、UNION(UNION中的第二个或者后面的查询语句)、SUBQUERY(SELECT/WHERE之后包含了子查询)等
(3)type *
表示连接类型,性能由好到差的连接类型为NULL、system、const、eq_ref、ref、range、index、all。
NULL:MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,一般业务系统的sql不可能会优化到null
system: 访问系统表
const: 根据主键或唯一索引访问
eq_ref、ref: 使用非唯一性的索引进行查询
range:只检索给定范围的行,使用一个索引来选择行
index: 使用了索引但只遍历索引树
all:遍历全表以找到匹配的行
(4)possible_keys *
显示可能用到的索引
(5)key *
实际用到的索引,没用到显示null
(6)key_len *
使用到索引的字节数,显示的是索引字段的最大可能长度,并非实际使用长度,不损失精确性的情况下,长度越短越好
(7)ref
列与索引的比较,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
(8)rows
估算出结果集行数
(9)filtered
表示返回结果的行数占需读取行数的百分比,filtered的值越大越好。
(10)Extra *
using index condition:查找使用了索引,但是需要回表查询数据
using where;using index:查找使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询数据

posted @ 2022-05-12 15:58  py卡卡  阅读(110)  评论(0编辑  收藏  举报