Mysql查询截取分析(1)

322 阅读2分钟

这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战

1、查询优化

1.1、order by 关键字优化

建表和索引

create table tblA(
#id int primary key not null auto_increment,
age int,
birth timestamp not null
);

insert into tblA(age, birth) values(22, now());
insert into tblA(age, birth) values(23, now());
insert into tblA(age, birth) values(24, now());

create index idx_A_ageBirth on tblA(age, birth);

问题引出,观察以下 SQL 执行结果

image-20200922223025192

image-20200922223127491

image-20200922223205875

image-20200922223441704

解析

MySQL 支持两种方式排序,Using fIlesort 和 Using index,Index 的效率更高。

Order By 满足两个情况会使用 index 排序

  1. Order by 语句使用索引最左前列
  2. 使用 where 子句与 Order By 子句条件列组合满足索引最左前列

尽可能在索引列上完成排序操作,遵守最佳左前缀。无法使用索引时,增大 sort_buffer_size 参数的设置或增大 max_length_for_data 参数设置。

1.2、Group by 关键字优化

和 order by 类似:

  • group by 实质是先排序后进行分组,遵守索引最佳左前缀。

  • 无法使用索引时,增大 sort_buffer_size 参数的设置或增大 max_length_for_data 参数设置。

  • where 高于 having,能写 where 就不写 having。

2、慢查询日志

慢查询日志是 MySQL 提供的一种日志记录,用来记录在MySQL中相应时间超过阈值的语句,具体指运行时间超过 long_query_time 值的SQL,会被记录到慢查询日志中。long_query_time 默认值是10秒,可以手动设置。

查看、开启与设置

#查看
SHOW VARIABLES LIKE "%slow_query_log%";
#开启
SET GLOBAL slow_query_log = 1;
#查看慢查询的阈值
SHOW VARIABLES LIKE "%long_query_time%";
#设置阈值 3 秒,设置后再次查看没有变化,需要新的命令窗口查看才有变化
SET GLOBAL long_query_time = 3;
#查看当前系统有多少慢查询记录
SHOW GLOBAL STATUS LIKE "%slow_queries%";

测试与使用

使用 select * sleep(4) 制造一个慢查询,执行后来到记录日志的地方查看。

image-20200923090626174

日志分析工具mysqldumpslow

使用 mysqldumpslow --help; 命令查看 mysqldumpslow,需要开启慢日志查询。

image-20200923093156666

参数解释:

  • s:表示按照何种方式排序
  • c:访问次数
  • i:锁定时间
  • r:返回记录
  • t:查询时间
  • al:平均锁时间
  • ar:平均返回记录数
  • at:平均查询时间
  • t:返回前面多少条数据
  • g:后面搭配正则匹配模式

例如:

image-20200923094055521