mysql 索引使用总结

select 语句是否用到了索引,可以使用mysql的 explain 来执行后查看。下面做一个比较基础的总结。

索引常用类型:

Normal 普通索引

unique 唯一索引

fulltext 文本索引

 

添加索引语句:

alter table t_user ADD INDEX  idx_name (name);

 

explain select 结果如下图所示(参考示例)

说下字段的意思:

table:

表示数据来自哪张表

type: 

最好到最差的类型:  const , eq_ref,ref,range,index 和ALL

  1. ALL: 表示走的全表扫描
  2. ref:连接查询(如left join)不是主键或唯一约数的索引(普通索引),根据索引匹配的记录越少越好
  3. eq_ref :连接查询(如left join) 使用了主键为主键或唯一约数的时候 ,如 where user.id = teacher.id 
  4. index : 用在fulltext字段,
  5. range: 索引范围,比如 >  , <     

        in: 测试,使用如下explain select * from t_user  u where u.id in (1,2,3) ,如果1,2,3有记录,则走range索引,如果 1,2,3其中有一个没有对应的数据库表记录,则走all ,如果in 其中一个则使用const,效率最高。

not in :

explain select * from t_user  u where u.id not in (1,2) 

not in  字段(主键或唯一约数)如果多条记录走的all, 如果not in 一个 则走range索引 

not in  字段(非索引或 普通索引),通过测试后发现,则不管有1个还是多个,都走的ALL

 

possible_keys 

显示查询可能用到的索引(一个或者多个或为null) ,不一定被查询实际使用,仅供参考

 

Key:

实际使用的索引字段,如果为NULL,表示没有使用索引

 

key_len :

索引的长度(字节数),不丢失精度经情况下,值越小越好

ref:

索引哪一列或者常量(const)

rows:

表示找到所需记录需要读取的行数,值越大越不好

extra : 

using where: 使用where 过滤

 

 

那些where条件会导致索引无效

  • where 条件有 != ,Mysql无法使用索引
  • where 字句使用mysql函数,索引将无效

        如:

         explain select * from t_user t where upper(name)='yzy'  不走索引,

        explain select * from t_user t where  name='yzy'  走索引

  • like索引,  like 'xxx%'有效, like '%xx%' 索引无效

       如:

         explain select * from t_user where name like 'y%';   -- 走range 索引

         explain select * from t_user where name like '%y%';   

  • 字符串使用'',不使用''不走索引
  • 在where 子句中使用is not null 不走索引

            explain select * from t_user where name is not null;   --  全表扫描,type:ALL

            explain select * from t_user where name is null;   -- 走索引,type:ref

  • 如果条件中有or不走索引 ,建议少用or,如果要用or则or的每个列都要加索引,数据量少的时候,possible_keys会出现可能得索引列

           explain select * from t_user where (name ='yzy' or pwd='1');    -- 走ALL,建议少用or

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值