mysql索引失效的原因

mysql索引失效总结

一、单表查询时索引失效

     1、mysql查询单表时,查询得到的结果集占数据总量很大比例,mysql会认为全表扫描会优于索引,则不走索引。

       例:比如企业人员信息表 (userInfo),字段(user_id、user_name、user_type(vachar)),假设企业里有10w人,一千个管理层user_type为1,9万9千人为普通员工user_type为2,

      sql:select * from userInfo where user_type='2' 这时user_type字段索引可能会失效

      2、查询时where条件后的字段类型要与表结构中该字段类型一致,

      例:select * from userInfo where user_type=2 ,user_type在表结构中时字符类型,查询时没用有单引号包含起来则不走索引。

      3、在where条件后对索引字段加了函数转换或者运算逻辑(+、-、*、/、!、<>、%、like'%_'(%放在前面)、or、in (疑问、可能存在成本问题)、exist等)的处理,比如对时间戳字段进行日期格式化函数都会引起索引失效。

二、多表关联查询时索引失效

      1、在表结构设计阶段主表与关联表之间的关联字段的数据类型、数据长度、字段的编码格式以及字段的排序规则需要保持一致

三、组合索引

      1、当一张表的查询方式比较固定,这时候可以尝试创建聚集索引,查询时应当遵从组合索引的规则,最左原则,查询时使用最频繁的一列放在最左边,

      例:index(user_id,user_name,user_type)这是一个组合索引,当查询时如果想走索引则 

      sql:select * from userInfo where user_id='001' and user_name='小张' and user_type='1';这个时候是走了索引的,但是

               select * from userInfo where  user_name='小张' and user_type='1';这时user_id没有在where条件内将不走索引;

此例,user_id字段必须出现在where后面,不然索引将不会生效。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值