• 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)复合索引时,谓词非前导列的时候
  • 相关阅读:
    php查找字符串中的http地址,并转换
    mojoPortalprovider模式学习之1.1 IndexBuilderConfiguration
    mojoportal学习笔记之一
    写博客了
    mojoPortal学习笔记之IndexBuilderProvider
    mojoportal学习笔记之IIndexableContent接口
    mojoportal学习笔记之How to Write a Provider Model
    flash图片新闻(源码)
    GridView控件日期格式化
    改变自己,学会调整自己,保持美好工作心情!
  • 原文地址:https://www.cnblogs.com/lichihua/p/10715921.html
Copyright © 2020-2023  润新知