小工具知识网

当前位置: 首页 > 行业知识 > 索引失效的7个原因

行业知识

索引失效的7个原因

2026-11-13 15:05:09 来源:互联网转载

索引失效的7个原因

  • 概述
  • 1. 最左匹配原则
  • 2. 使用函数
  • 3. 计算操作
  • 4. Like %
  • 5. 使用Or导致索引失效
  • 6. in使用不当
  • 7. order By
  • 8. 总结
  • 9. 补充 SELECT *
  • 参考

    实际工作以及面试��,应该经常会遇到SQL相关的问题,而这些问题中,索引失效的场景又是一个常客。下面总结一下索引失效的场景,一共7种,索引失效的原因逃不过这7个。

    概述

    主要内容如下:

    先创建一张表用于测试,表中创建了三个索引(MySQL版本8.0.26)

    • 主键索引 id
    • 普通索引 age
    • 联合索引 name,code,address
      SET NAMES utf8mb4;SET FOREIGN_KEY_CHECKS = 0;-- ------------------------------ Table structure for user-- ----------------------------DROP TABLE IF EXISTS `user`;CREATE TABLE `user`  (  `id` int(11) NOT NULL AUTO_INCREMENT,  `name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,  `code` int(100) NULL DEFAULT NULL,  `address` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `age` int(11) NULL DEFAULT NULL,  `create_time` datetime(0) NOT NULL ON UPDATE CURRENT_TIMESTAMP(0),  PRIMARY KEY (`id`) USING BTREE,  INDEX `普通索引`(`age`) USING BTREE,  INDEX `联合索引`(`name`, `code`, `address`) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;-- ------------------------------ Records of user-- ----------------------------INSERT INTO `user` VALUES (1, '海绵宝宝', 1001, '上海', 23, '2022-11-02 20:44:14');INSERT INTO `user` VALUES (2, '章鱼哥', 1002, '北京', 22, '2022-11-02 20:44:16');INSERT INTO `user` VALUES (3, '派大星', 1003, '苏州', 23, '2022-11-02 20:44:19');INSERT INTO `user` VALUES (4, '蟹老板', 1004, '南通', 24, '2022-11-02 20:44:25');

      1. 最左匹配原则

      最左匹配原则就是指在联合索引中,如果你的 SQL 语句中用到了联合索引中的最左边的索引,那么这条 SQL 语句就可以利用这个联合索引去进行匹配,并且最左优先,以最左边的为起点任何连续的索引都能匹配上。同时遇到范围查询(>、、 1 and name = "派大星" and address = "上海"

      把code=1改为code>1,执行:

      虽然也使用了联合索引,但是她的type是range。而改造前的type如下图是ref:

      那么type位range和ref的区别是什么呢?

      可以理解为:range是范围查找,ref是索引查找。

      根据官方描述,扫描方式从快到慢依次是:

      也就是说,**遇到范围查询(>、

上一篇:APP下载平台使用指南,一键获取下载链接,轻松上手!

下一篇:服务器软件怎么加入自启动?