创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因?(性能分析)

使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理SQL语句的

1.type字段:

结果值从最好到最坏依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

SQL 性能优化的目标:至少要达到 range级别,要求是ref级别,最好是 consts级别

ALL:全表扫描,没有用到索引

inex:覆盖索引:一个索引中包含了要的数据

range:范围扫描索引,一般就是where语句中出现了between、<、>、in等的查询

ref:普通二级索引与常量等值匹配

eq_ref:连接查询时,主键或非空唯一二级索引等值匹配

consts:通过主键或唯一二级索引列与常量等值匹配

2.possible_keys 和 keys

possible_keys表示可能用到的索引

keys表示实际用到的索引,如果为null,就是没有使用索引

3.key_len

表示索引使用的字节数,根据这个值可以判断索引的使用情况

计算:

1.先看索引字段的类型,比如:int=4 ; varchar(20) =20 ; char(20) =20

2.如果是varchar或者是char,视字符集乘以3或者4,utf8乘以3,utf8mb4乘以4,GBK乘以2

3.varchar这种动态字符串要再加2个字节

4.允许为空的字段再加1个字节

4.rows

执行查询时检查行数

5.filtered

命中率(查询结果占检查行数的百分比)

6.exta:额外信息

Impossible WHERE:where子句的值总是false

Using where:使用了where:但在where上有字段没有创建索引

Using temporary:使用了临时表保存中间结果

Using filesort:(手工排序)排序操作没用到索引

Using index:使用了覆盖索引:表示直接访问索引就足够获取到所需要的数据:不需要通过索引回表

Using index condition:使用索引下推优化

索引下推优化:比如有两个查询条件,查询到第一条二级索引记录,不着急回表,先判断一下另一个条件是否满足,如果不满足,就放弃该条二级索引记录

Using join buffer:在连接查询时,当被驱动表不能有效的利用索引时,MySQL会提前申请一块内存空间(join buffer)来加快查询速度

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值