使用explan排查分析对慢sql进行调优的口诀和案例3

一 概述1.1 优化索引口诀优化的口诀如下:全值匹配我最爱, 最佳左前缀法则;带头大哥不能死, 中间兄弟不能断;索引列上少计算, 范围之后全失效;LIKE 百分写最右, 覆盖索引不写*;不等空值还有 OR, 索引影响要注意;VAR 引号不可丢, SQL 优化有诀窍。1.1.1 全值匹配我最爱CREATE INDEX idx_age_deptid_name ON emp(age,deptid,NAME); 结论:全职匹配我最爱指的是,查询的字段按照顺序在索引..
摘要由CSDN通过智能技术生成

一 概述

1.0 sql调优的过程

SQL调优过程:

  1. 观察,至少跑1天,看看生产的慢SQL情况。
  2. 开启慢查询日志,设置阙值,比如超过5秒钟的就是慢SQL,并将它抓取出来。
  3. explain + 慢SQL分析。
  4. show profile,查询SQL在Mysql服务器里面的执行细节和生命周期情况。
  5. 运维经理 or DBA,进行SQL数据库服务器的参数调优。

1.1索引失效以及优化口诀

优化的口诀如下:

全值匹配我最爱, 最佳左前缀法则 

带头大哥不能死, 中间兄弟不能断;

索引列上少计算, 范围之后全失效;

LIKE 百分写最右, 覆盖索引不写 *

不等空值还有 OR, 索引影响要注意;

VAR 引号不可丢, SQL 优化有诀窍。

在索引列上进行了函数操作,MySQL内部会进行了隐式转换,导致索引失效,从而产生全表扫描。

注意:以下操作都是在这个新建的索引下进行的操作,如下:

alter table staffs add index idx_staffs_nameAagePos(name,age,pos)

1.1.1 全值匹配我最爱

CREATE INDEX idx_age_deptid_name ON emp(age,deptid,NAME);

CREATE INDEX idx_age_deptid_name ON emp(age,deptid,NAME);

结论:全职匹配我最爱指的是,查询的字段按照顺序在索引中都可以匹配到,优化器会在不影响 SQL 执行结果的前提下,给你自动地优化。

1.1.2  最佳左前缀法则,带头大哥不能死, 中间兄弟不能断;

使用复合索引,需要遵循最佳左前缀法则,即如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列

创建索引:alter table staffs add index idx_staffs_nameAagePos(name,age,pos)

下图中的第二个sql: 即使跳过了中间的索引,但是其长度没变化,跟第一个sql只使用name的索引的长度一样,那就说明第二个sql值使用了部分索引,只使用了name的索引,后面的age,pos失效。不然的话长度肯定大于74。

结论: 过滤条件要使用索引必须按照索引建立时的顺序,依次满足, 一旦跳过某个字段,索引后面的字段都无 法被使用

 1.1.3  索引列上少计算

 不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描。

 所以字符串类型的数据,该加单引号的一定要加!

  1.1.4  范围之后全失效

复合索引CREATE INDEX idx_age_deptid_name ON emp(age,deptid,NAME);

索引列上不能有范围查询,少用>,<,between…and等结构;范围查询的列忽略,索引失效,后面的索引列也跟着失效,不起作用。

 建议:将可能做范围查询的字段的索引顺序放在最后

  1.1.5  覆盖索引不写 *

即查询列和索引列一致,不要写 select *!, 尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致))区别在于extra,索引的不同,速度不一样

   1.1.6  使用不等于(!= 或者<>)的时候

mysql 在使用不等于 (!= 或者 <>) 时,有时会无法使用索引会导致全表扫描。这个得知道这种情况,根据业务情况,得写这种范围查询,还是要写的。一切满足业务。

   1.1.7 不用 is null 或者is not null 

1. 如果字段age实则为not null 时候,  age is null  和 age is not null 都没有使用到索引

 

 2.如果字段age实则为null 时候, age is null 使用到了索引,age is not null 没有使用到索引

    1.1.8 LIKE 百分写最右

1. 注意看模糊查询的细节,只有xx%前缀查询才不会失效

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值