• 数据库索引失效


    记录一下,方便自己记忆.

    前提:参考

    1.建表:

    1. mysql> CREATE TABLE `user` (
    2. -> `id` int NOT NULL AUTO_INCREMENT,
    3. -> `code` varchar(20) COLLATE utf8mb4_bin DEFAULT NULL,
    4. -> `age` int DEFAULT '0',
    5. -> `name` varchar(30) COLLATE utf8mb4_bin DEFAULT NULL,
    6. -> `height` int DEFAULT '0',
    7. -> `address` varchar(30) COLLATE utf8mb4_bin DEFAULT NULL,
    8. -> PRIMARY KEY (`id`),
    9. -> KEY `idx_code_age_name` (`code`,`age`,`name`),
    10. -> KEY `idx_height` (`height`)
    11. -> ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
    12. Query OK, 0 rows affected (0.04 sec)

    2.插入数据

    1. INSERT INTO user (id, code, age, name, height , address) VALUES (1, '101', 21, '周星驰', 175,'香港');
    2. INSERT INTO user (id, code, age, name, height , address) VALUES (2, '102', 23, '周杰伦', 171,'台湾');
    3. INSERT INTO user (id, code, age, name, height , address) VALUES (3, '103', 25, '周晓', 173,'成都');

    3.mysql版本

    肯定失效:

    2.or连接的所有字段只要有一个没有建立索引则不能命中索引--->所有字段都建立索引,索引有效.

    3.不符合最左匹配原则

    4.like "%**"或like "%**%"不能命中索引.--->like "**%"索引有效.

    5.字符串类型没有加 '', 如 id_card = 1345 ,其中字段id_card为char类型,会索引失效-->id_card = '1345'

    6. 索引列上有计算/函数,会索引失效.

    7.如果把两个单独建了索引的列,用来做列对比时索引会失效.

    可能失效:

    1.使用select *

    不失效,id为主键索引

    explain select * from user where id = 1;

     失效,name字段上没有建立索引

    explain select * from user where name = '周晓';

     但如果上句sql改为查询索引字段,如

    explain select code , age, name from user where name = '周晓';

    则不会去主键索引树进行全表扫描,会去联合索引树上进行全索引扫描.联合索引树叶子节点只存储所有联合索引字段和主键数据,但主键索引树的叶子节点存储所有字段数据信息,因此全索引扫描(index)比全表扫描(ALL)稍微快点.

    2.使用not in

    不失效,主键字段中使用not in关键字查询数据范围.

    注意:这里我用mysqlv5.7.39测试,主键字段中使用not in关键字查询数据范围也失效了,但在这篇文章中该作者使用mysqlv8.0.21,索引没有失效.

    失效,普通索引字段使用了not in关键字查询数据范围.

     3.使用order by

    此情况也因版本不一样,索引是否失效也不同.

    不失效,配合where使用.

     注意,此时where后面的字段和order by 后面的字段要满足最左匹配原则,否则失效.具体实例见失效情况分析.

    失效,不满足最左匹配原则.

     失效,没加where.

      失效,对不同的索引做order by.

  • 相关阅读:
    redis
    LinkedHashSet创建Integer类型的数据
    JSP 视频点播系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
    文献综述笔记
    Django ORM查询之聚合函数、聚合查询(aggregate)、分组查询(annotate)
    mysql面试题四(事务)
    基于python的urllib 库抓取网站上的图片
    JS 逆向高阶之 - nodejs 常用的几个加密, 解密的库
    Linux常用命令详解
    Mysql8.0为什么取消了缓存查询的功能
  • 原文地址:https://blog.csdn.net/DYYssb/article/details/126810347