in 索引失效的问题

先安利一篇博文MySQL的or/in/union与索引优化

简单的in查询 索引失效:

步骤

1、检查建立索引没有

       order_status 字段为普通索引的tinyint类型 

2、检查是否使用了使索引失效的语句

3、explain查看执行计划

而 in(1)时会走索引

5、查看是否关闭的全局的索引(Comment显示disabled则表示关闭了索引)   

SHOW KEYS FROM wy_order;

关闭:ALTER TABLE `wy_order` DISABLE KEYS ;
开启:ALTER TABLE `wy_order` ENABLE KEYS;

还找不到原因。。

难道是mysql查询优化器认为全表扫描时如果速度大于使用索引,就会不用索引

此外,查看索引的使用情况
show status like ‘Handler_read%';
注意:
handler_read_key:这个值越高越好,越高表示使用索引查询到的次数
handler_read_rnd_next:这个值越高,说明查询低效

 那么使用强制索引呢

强制索引是生效的,求大佬告知(是mysql查询优化器认为全表扫描时如果速度大于使用索引,就会不用索引)是不是我猜想的这样呀

 

补充:索引失效

不走索引的情况,
1)被查询出来的数据超过一定比例的时候,譬如表里有1000万条记录,一条SQL查的结果有600万,肯定不会走索引了
2)索引列上用了函数的时候,例如where to_char(id) = ...
3)索引列上发生类型转换的时候,如number列你偏写成where col = '1',加了引号
4)没有收集统计信息的时候,CBO是生成执行计划是要看统计信息的,在oracle 9i时,统计信息不是自动收集的,有没有碰到这样的情况:一条SQL一直正常,某天突然很慢很慢,一般就是统计信息没有收集的原因。
5)强制全表扫描的时候
6)索引失效的时候  
使用+ - * / ! 等运算符号
使用 <> 、not in 、not exist、!=
  like "%_" 百分号在前(可采用在建立索引时用reverse(columnName)这种方法处理)
单独引用复合索引里非第一位置的索引列.应总是使用索引的第一个列,如果索引是建立在多个列上, 只有在它的第一个列被where子句引用时,优化器才会选择使用该索引
当变量采用的是times变量,而表的字段采用的是date变量时.或相反情况
索引列存在null
7)复合索引时,谓词非前导列的时候

 

转载于:https://www.cnblogs.com/lichihua/p/10715921.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值