分析SQL执行效率2

有时需要确定 SQL 到底慢在哪个环节,此时 explain 可能不好确定。在 MySQL 数据库中,通过 profile,能够更清楚地了解 SQL 执行过程的资源使用情况,能让我们知道到底慢在哪个环节

下面我们来讲一下如何使用 profile 分析慢查询,大致步骤是:确定这个 MySQL 版本是否支持 profile;确定 profile 是否关闭;开启 profile;执行 SQL;查看执行完 SQL 的 query id;通过 query id 查看 SQL 的每个状态及耗时时间。

1.确定是否支持 profile

select @@have_profiling;

 

 

 2.查看 profiling 是否关闭的(默认关闭)

select @@profiling;

 

 

 3.通过 set 开启 profile

set global profiling=1;

4.执行sql

select * from t1 where b=1000;

5.确定 SQL 的 query id

show profiles;

 

 

6.查询 SQL 执行详情

 通过 show profile for query 可看到执行过的 SQL 每个状态和消耗时间:

show profile for query 114;

 

通过以上结果,可以确定 SQL 执行过程具体在哪个过程耗时比较久,从而更好地进行 SQL 优化与调整

扩展知识点

MySQL 常见排序模式:

  • < sort_key, rowid >双路排序(又叫回表排序模式):是首先根据相应的条件取出相应的排序字段和可以直接定位行数据的行 ID,然后在 sort buffer 中进行排序,排序完后需要再次取回其它需要的字段;
  • < sort_key, additional_fields >单路排序:是一次性取出满足条件行的所有字段,然后在sort buffer中进行排序;
  • < sort_key, packed_additional_fields >打包数据排序模式:将 char 和 varchar 字段存到 sort buffer 中时,更加紧缩。

三种排序模式比较:

第二种模式相对第一种模式,避免了二次回表,可以理解为用空间换时间。由于 sort buffer 有限,如果需要查询的数据比较大的话,会增加磁盘排序时间,效率可能比第一种方式更低。

MySQL 提供了一个参数:max_length_for_sort_data,当“排序的键值对大小” > max_length_for_sort_data 时,MySQL 认为磁盘外部排序的 IO 效率不如回表的效率,会选择第一种排序模式;否则,会选择第二种模式。

第三种模式主要解决变长字符数据存储空间浪费的问题。

 

posted @ 2020-07-23 16:20  |那小子  阅读(170)  评论(0编辑  收藏  举报