1.查看SOL执行频率
MySQL客户端连接成功后,通过如下指令,可以查看当前数据库的insert、update、delete、select的访问频次:
show global status like 'Com_______';
#查看全局。后面是7个下划线
使用效果如下:
可以看到各条命令的使用次数。
一般都是查询命令使用最多,所以查询命令一般就是影响SQL性能的关键
2.慢查询日志
慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句。
MySQL的慢查询日志默认没有开启,如果不确定是否开启了,可以通过下图的命令查看:
如果没有开启,则需要在MySQL的配置文件/etc/my.cnf中添加如下信息:
# 开启MySOL慢日志查询开关
slow_query_log=1# 设置慢日志的时间为2秒,SQL语句执行时间超过2秒,就会视为慢查询,记录慢查询日志
long _query_time=2
配置完毕之后,重启mysql服务。
systemctl restart mysqld
我用centos7、mysql8.3.0做到这一步时,mysql服务启动不了,但要是把配置文件/etc/my.cnf改回原样就又能开启mysql服务了,不知道为什么
然后就可以找到慢查询日志文件:/var/lib/mysql/localhost-slow.log
下图是一条超过了规定时间,被记载在慢查询日志文件中的SQL语句
可以看到,文件中记载了使用SQL语句的时间、用时、用户名、客户端名、库名等信息
3.profile
profile可以查看各个命令的耗时,还可以查看某条命令各个阶段的耗时
3.1查看mysql是否支持profile
select @@have_profiling;
像上图一样出现yes时,代表mysql支持profile
3.2查看profile是否开启、开启profile
select @@profiling;
像上图一样显示为0,代表profile没有开启;显示为1则代表已开启。
如果没有开启,可以通过以下命令开启:
set profiling=1;
3.3使用profile
(1)查看所有命令耗时
show profiles;
(2)查看命令各个阶段耗时
show profile [cpu] for query query-id;
#加上参数cpu,可以查看命令各个阶段占用cpu的情况
#query-id就是用show profile得到的各条命令第一列的数字编号
4.explain(最主要的查看手段)
在任意一句SQL语句开头加上explain或desc,就可以查看这条命令的许多信息。例如下图:
id | select查询的序列号。 id相同,执行顺序从上到下;id不同,值越大,越先执行 | |
select_type | 表示 seclect 的类型 | SIMPLE:简单表。即不使用表连接或者子查询 |
PRIMARY:主查询,即外层的查询 | ||
UNION:UNION 中的第二个或者后面的查询语句 | ||
SUBQUERY:包含了子查询 | ||
type(最重要指标) | 表示连接类型。 性能由好到差的连接类型为NULL、system、const、eq_ref、ref、range、index、all 。 | all:遍历整个表 |
index:遍历整个索引 | ||
ref:使用了非唯一索引 | ||
const:只使用了主键索引或者唯一索引 | ||
null:不涉及表 | ||
*possible key | 显示可能应用在这张表上的索引,一个或多个。 | |
*key | 实际使用的索引,如果为NULL,则没有使用索引。 | |
*Key _len | 表示索引中使用的字节数,该值为索引字段最大可能长度,并非实际使用长度,在不损失精确性的前提下,长度越短越好 |