mysql索引别名_浅谈mysql索引

一、EXPLAIN使用说明

(1)id:

数值相同,依次执行

数值越大优先级越高

(2)select_type:

simple-->不包含子查询和union

primary-->当查询包含子部分 最外层标记为primary

subquery-->select或where包含子查询

derived-->在from列表中包含的子查询被标记为derived(衍生),mysql会递归这些子查询,结果放入临时表

union-->略

union result-->从union表获取结果的select

(3)table:

表名或者表别名

(4)type:

从好到怀--> system > const > eq_ref > ref > range > index > all

优化建议:至少达到ref或eq_ref级别

(5)possible_key:

可能用到的key

(6)key:

实际用到的key

(7)key_len:

索引中使用的字节数,越小越好

(8)ref:

索引被谁使用了

(9)rows

估算大概读取的行数

(10)extra

优化建议:

出现using temporary 表示使用了临时表,强烈建议优化  常规导致原因order by、group by、distinct

出现using filesort 表示使用了排序但是排序字段未使用索引  强烈建议添加索引

二、inner join、left join、right join与索引

首先,两个概念--驱动表和被驱动表,很重要,因为他决定着你on后条件的索引是否生效。

如何判断谁是驱动表谁是被驱动表 ?

(1)当使用left join时,左表是驱动表,右表是被驱动表

(2)当使用right join时,右表时驱动表,左表是驱动表

(3)当使用inner join时,mysql会选择数据量比较小的表作为驱动表,大表作为被驱动表,

知道谁是驱动表有什么用?

(1)A left join B on A.a=B.a,此时A是驱动表,B是被驱动表,只需要在被驱动表的a字段添加索引即可被引用

(2)被驱动表在on中可以使用联合索引,如A left join B on A.a=B.a and B.b=1 ,此时在B建立联合索引a,b即可被引用

(3)在使用on的时候被驱动表在where条件里的参数是不能引用索引的

三、影响索引使用的因素

(1)字段可为null,is not null不走索引,字段设置not null,is null,is not null都不走索引

(2)若索引列出现了隐式类型转换

select * from user where tel= 12345678901;  tel索引未被引用

select * from user where tel= '12345678901';    tel索引可被引用

(3)WHERE条件中含有or,除非or条件中的所有列都是索引列,否则MySQL不会选择索引

(4)联合索引生效需要过滤条件依次执行

(5)如果对索引字段进行函数、算术运算或其他表达式等操作,那么MySQL不使用索引

(6)like的时候以匹配字符开头不走索引,如'%abc'不能,但'abc%'走索引

(7)mysql  in是能走索引的,not in 不走索引

(8)between and 是能走索引的,not between and 不走索引

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值