数据库索引失效的情况

1、列与列之间的对比
 比如一张表中的两列(id和c_id)都单独建立了索引,但是下面这种情况不会走索引           
         select * from table where id = c_id;  //这种情况会被认为还不如走全表扫描
2、存在NULL值
 我们在设计数据库时尽量避免NULL值的出现,如果不可避免地要出现NULL值的情况,也要这是默认值,比如数值类型的可以设置为0或者-1,字符串可以设成空字符串或者其他的东西。
 如果索引列是可空的,是不会给其创建索引的,索引值是小于表的count(*)值的,这种情况下也会去全表扫描。            
  select * from table where id is not null;
3、存在NOT条件
我们知道建立索引的时候。给每一个索引建立一个条目,如果查询条件为等值查询或者范围查询的时候 ,索引可以根据查询条件去找对应的条目。但是如果查村条件为非得时候,索引就定位困难了,执行计划可能更倾向于全表扫描,这类查询条件有:<>、not 、not in 、not exit           
select * from test where id<>500;            
select * from test where id in (1,2,3,4,5);  //不走索引            
select * from test where id in (1);         //走索引            
select * from test where not in (6,7,8,9,0);            
select * from test where not exists (select 1 from test_02 where test_02.id=test.id);
4、Like通配符
当使用模糊查询的时候尽量使用后置通配符,例如name || '%',前置匹配更倾向于全表扫描,而后置匹配可以走INDEX RANGE SCAN。            
     select * from table where name like 张|| '%'
5、条件中有or,索引也会失效
6、条件上包括函数
 查询条件上尽量不要对有索引的列使用函数,例如:            
        select * from table where upper(name) == "ABC";           
  因为索引建立的时候会和计算以后的可能不同,无法定位到索引。但是如果查询条件不对索引列进行计算,那么依然可以走索引。例如:            
        select * from table where name = upper("abc");    ---INDEX RANGE SCAN
7、如果列类型是字符串,那一定要在条件中将数据使用引号引用起来(就是查询的数据和字段的类型保持一致)否则索引失效。
8、如果mysql估计使用全表扫描要比使用索引快,则不适用索引。
9、在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。查询字段包含复合索引的字段,且条件和查询字段的顺序一致。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值