这是我参与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 执行结果
解析
MySQL 支持两种方式排序,Using fIlesort 和 Using index,Index 的效率更高。
Order By 满足两个情况会使用 index 排序
- Order by 语句使用索引最左前列
- 使用 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) 制造一个慢查询,执行后来到记录日志的地方查看。
日志分析工具mysqldumpslow
使用 mysqldumpslow --help; 命令查看 mysqldumpslow,需要开启慢日志查询。
参数解释:
- s:表示按照何种方式排序
- c:访问次数
- i:锁定时间
- r:返回记录
- t:查询时间
- al:平均锁时间
- ar:平均返回记录数
- at:平均查询时间
- t:返回前面多少条数据
- g:后面搭配正则匹配模式
例如: