• mysql 索引欣失效的情况


    一、准备工作

    1、新建一张表,并建立两个多个索引

      脚本如下

         

    1. CREATE TABLE `t_user` (
    2. `id` int(11) NOT NULL AUTO_INCREMENT,
    3. `name` varchar(50) DEFAULT NULL,
    4. `school` varchar(50) DEFAULT NULL,
    5. `age` int(11) DEFAULT NULL,
    6. `grade` varchar(30) DEFAULT NULL,
    7. PRIMARY KEY (`id`),
    8. KEY `age` (`age`) USING BTREE,
    9. KEY `school` (`school`) USING BTREE,
    10. KEY `name_grade` (`name`,`grade`) USING BTREE
    11. ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;

    其实中 age、school、name_grade为索引

    加两个数据

    1. INSERT INTO `t_user` VALUES ('1', '张三', '清华', '22', '一年级');
    2. INSERT INTO `t_user` VALUES ('2', '李四', '北大', '24', '二年级');

    二、具体情况

    1.  用 != 或者 <> 作为索引字段判断条件时 导致索引失效 

        如:

     改为 = 判断,索引立即生效

    2、索引字段类型在使用时与其真正字段类型不一致时,索引失效

       本例子中的mobile 字段类型varchar类型,如果查询语句这么写,

      

      发现结果也是正确的

    分析语句发现

    此语句却没有真正走索引

    如果电话加上引号,再分析下语句

    结果就走索引了

    这证明 如果数据库类型是varchar , 索引字段类型传入参数是long类型 结果是能查询出正确数据,只是索引失效了,如果反之索引也会失效吗,我们测试下看看结果

    以number字段为例,它在数据存的是long为类型,传入参数类型为 varchar类型,分析语句如下

     结果显示走索引了,据此我们可以得出结论

           如果数据库类型是varchar , 索引字段类型传入参数是long类型 结果是能查询出正确数据,只是索引失效了,  反之,

            如果数据库字段类型是long类型,索引字段传入参数是varchar类型,结果能查正确数据,索引没有失效

    数据库字段类型那么多,是不是其它类型也存在这个问题呢,我们可以一一测试下,具体细节不在展示,以下汇总结果

    索引字段类型  查询传参类型是否走索引
      varchar long 否
      varchar int
      varchar tinyint 否
      varchar double
      long varchar 是
     int varchar
     tinyint varchar
     double varchar
    decimal varchar

    在mysql 数据库中,从上面的统计结论可以看出,对于数字类型(具体类型如上表)的索引字段,传入参数为varchar类型,索引依然有效,反之则无效

    3、计算、函数导致索引失效

           例如

           

    4 、is null可以使用索引,is not null无法使用索引 

        结果如下

       

     

    5、like以通配符%开头索引失效 

      

       结尾会生效

     6.OR 前后只要存在非索引的列,都会导致索引失效

          school 是地索引列,sex 不是索引列,结果如下

     7、数据库和表的字符集统一使用utf8mb4

       统一使用utf8mb4( 5.5.3 版本以上支持 ) 兼容性更好,统一字符集可以避免由于字符集转换产生的乱码。不同的 字符集 进行比较前需要进行 转换 会造成索引失效。

  • 相关阅读:
    系统优化与微服务架构、分布式架构的合理性思考
    智能指针unique_ptr
    【达梦数据库】备份恢复后要执行两个sql语句
    HTML&CSS
    Spring之文件上传下载,jrebel,多文件上传
    [Spring笔记] Spring-40-Spring事务属性
    “Sources, Summary” report——“来源,摘要”报告
    ZYNQ7020:PS控制PL动态调整PWM占空比
    Flink 基础 -- 应用开发(项目配置)
    【JavaWeb】Servlet系列——使用纯Servlet做一个单表的CRUD操作(实际操作实现篇)
  • 原文地址:https://blog.csdn.net/yb546822612/article/details/126192966