我们在日常开发中可以对数据库进行性能分析,进而优化我们的SQL语句。我们可以通过以下几种方法进行性能的分析。

一、SQL语句执行频率

1.查看当前数据库的状态

语法:

SHOW GLOBAL STATUS;

MySQL入门系列10-数据库性能分析_性能分析

或者可以通过下面的命令模糊查询当前数据库的插入、查询、修改、删除的访问频率。

语法:

show global status like 'Com_______';

MySQL入门系列10-数据库性能分析_explain_02

我们可以通过查询当前数据库的插入、查询、修改、删除的访问频率,针对数据库进行优化。如果是查询的次数占大多数,那么我们就应该加上索引等方式优化查询的效率。如果是插入、修改比较多就可以使用其他方式优化效率。


二、慢查询日志

慢查询日志记录了执行时间超过指定参数long_query_time(默认10秒)的所有SQL语句的日志。MySQL的慢查询日志默认是没有开启的,我们需要手动开启,设置slow-query-log=1。

语法:

SHOW VARIABLES LIKE 'slow_query_log'

MySQL入门系列10-数据库性能分析_MySQL_03

如果值是ON说明我们开启了慢查询日志。 如果没有开启,我们需要到MySQL的配置文件etc下的cnf配置文件配置如下信息: 我们分别设置slow-query-log和 long_query_time。

MySQL入门系列10-数据库性能分析_explain_04

 设置好之后,我们重启MySQL服务。

我们执行一个查询时间超过1秒的SQL语句。

MySQL入门系列10-数据库性能分析_explain_05

最后我们在MySQL的 Data目录下查询慢查询日志记录。

MySQL入门系列10-数据库性能分析_性能分析_06

打开这个文件发现了我们刚才慢查询日志的相关日志记录。

MySQL入门系列10-数据库性能分析_explain_07

后面我们就可以通过这个文件,定位到一些操作比较耗时的SQL语句,然后对这些SQL语句进行优化。


三、profile详情查看耗时

show profiles可以帮助我们查看任意时间耗时的SQL语句执行情况。在使用之前我们需要通过have_profiling参数查看当前MySQL是否支持profile操作。

语法:

SELECT @@have_profiling;

MySQL入门系列10-数据库性能分析_explain_08

YES代表已经开启了profile,No代表没有开启profile。如果没有开启profile,我们可以设置set profiling=1 开启profile。

查看每一条SQL的耗时基本情况

语法:

SHOW PROFILES;

MySQL入门系列10-数据库性能分析_MySQL_09

可以查询最近每一条查询语句的耗时情况,针对耗时情况进行对应的SQL优化。


四、explain执行计划

我们可以通过EXPLAIN或者DESC命令获取MySQL任何执行查询语句的信息,包括执行过程中表如何连接和连接的顺序等。

语法:

EXPLAIN SELECT 字段列表 FROM 表名 WHERE 条件...;

SQL语句:

explain select result from t_protocol_log WHERE id > 1000;

MySQL入门系列10-数据库性能分析_MySQL_10

Explain执行计划返回的各个字段含义如下图所示:

字段        

含义

id

select查询的序列号,表示查询中执行select子句或者是操作表的顺序。

select_type

表示SELECT的类型,常见的取值有SIMPLE(简单表查询),PRIMARY(主查询),UNION(联合查询),SUBQUERY(子查询)

type        

表示连接类型,性能由好到坏的连接类型为NULL、system、const、eq_ref、ref、range、index、all.

possible_key        

在这张表上可能会使用到的索引,一个或多个

key        

实际使用的索引

key_len        

表示索引中使用的字节数,该值为索引字段最大可能长度。长度越短越好

rows        

MySQL认为必须要执行查询的行数

filtered        

表示返回结果的行数占需读取行数的百分百,值越大越好

对于type 字段值补充说明:

  1. NULL:一般不太可能优化到NULL,除非在查询的时候不访问任何表,比如Select 'A'
  2. system :一般出现在访问系统表时
  3. const :一般出现在使用主键或者唯一索引访问时
  4. ref :一般出现在使用非唯一性索引访问时
  5. range :一般出现在使用了非唯一索引, 但是范围匹配, 比如age > 18