目录:
- SQL优化的一般步骤
参考/来源:
SQL优化的一般步骤
通过慢查日志等定位那些执行效率较低的 SQL 语句
explain 分析SQL的执行计划,需要重点关注 type、rows、filtered、extra
show profile 分析
了解 SQL 执行的线程的状态及消耗的时间。
默认是关闭的,开启语句“set profiling = 1;”
SHOW PROFILES ; SHOW PROFILE FOR QUERY #{id};
trace
trace分析优化器如何选择执行计划,通过 trace 文件能够进一步了解为什么优惠券选择 A 执行计划而不选择 B 执行计划。
set optimizer_trace="enabled=on"; set optimizer_trace_max_mem_size=1000000; select * from information_schema.optimizer_trace;
确定问题并采用相应的措施
- 优化索引
- 优化 SQL 语句:修改 SQL、IN 查询分段、时间查询分段、基于上一次数据过滤
- 改用其他实现方式:ES、数仓等
- 数据碎片处理
书写高质量SQL的30条建议
Order by 底层原理和SQL优化
MySQL分页查询优化
一般来说,是将上一页的最大值当成参数作为查询条件的,通过where条件,快速定位起始位置。
SELECT * FROM operation WHERE type = 'SQLStats' AND name = 'SlowLog' AND create_time > '2017-03-16 14:00:00' ORDER BY create_time limit 10;
在新设计下查询时间基本固定,不会随着数据量的增长而发生变化。
索引覆盖+子查询优化
因为我们有主键id,并且在上面建了索引,所以可以先在索引树中找到开始位置的 id值,再根据找到的id值查询行数据。
/*子查询获取偏移4800000条的位置的id,在这个位置上往后取25*/ SELECT a.empno,a.empname,a.job,a.sal,b.depno,b.depname from emp a left join dep b on a.depno = b.depno where a.id >= (select id from emp order by id limit 4800000,1) order by a.id limit 25;
其他可以参考: