前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MysSQL索引会失效的几种情况分析

MysSQL索引会失效的几种情况分析

作者头像
CBeann
发布2023-12-25 19:10:35
740
发布2023-12-25 19:10:35
举报
文章被收录于专栏:CBeann的博客CBeann的博客

索引失效情况(MySQL5.7.24)

如果条件中有or,索引失效

代码语言:javascript
复制
DROP TABLE IF EXISTS `indexdemo`;
CREATE TABLE `indexdemo` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `name_index` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of indexdemo
-- ----------------------------
INSERT INTO `indexdemo` VALUES ('1', '1', '1');
INSERT INTO `indexdemo` VALUES ('2', '2', '2');
INSERT INTO `indexdemo` VALUES ('3', '3', '3');

有的说or字段里没有索引的会索引失效,我在id和name都建立了索引,还是失效的,这个地方可以注意一下。

在这里插入图片描述
在这里插入图片描述

对于多列索引,不是使用的第一部分(第一个),则不会使用索引

这个大家都是这么学的,最左前缀原则,就是对应这一条,但是我没有复现,所以不贴图了。

like “%开头” 会使得索引失效

代码语言:javascript
复制
DROP TABLE IF EXISTS `indexdemo`;
CREATE TABLE `indexdemo` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `parkid` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of indexdemo
-- ----------------------------
INSERT INTO `indexdemo` VALUES ('1', '1', '1', '1');
INSERT INTO `indexdemo` VALUES ('2', '2', '2', '2');
INSERT INTO `indexdemo` VALUES ('3', '3', '3', '3');

数据库中id,name都有索引,查询条件为 name like “%1”

在这里插入图片描述
在这里插入图片描述

查询条件中带(计算,函数,(自动或者手动)类型装换)会使索引失效

失效原因:索引的一个特性就是有序性,如果你(计算,函数,(自动或者手动)类型装换)了该字段,其实就是抹去了有序性,比如你做hash,那结果就是无序的,所以没办法使用索引。

代码语言:javascript
复制
DROP TABLE IF EXISTS `indexdemo`;
CREATE TABLE `indexdemo` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `parkid` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of indexdemo
-- ----------------------------
INSERT INTO `indexdemo` VALUES ('1', '1', '1', '1');
INSERT INTO `indexdemo` VALUES ('2', '2', '2', '2');
INSERT INTO `indexdemo` VALUES ('3', '3', '3', '3');

如果你写 where name =“1”,索引不会失效,但是你写name = 1,索引就会失效。因为发生了类型转换(数字1变为字符串1)

在这里插入图片描述
在这里插入图片描述

如有错误,请批评指正

参考

https://blog.csdn.net/guoxingege/article/details/51034387

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 索引失效情况(MySQL5.7.24)
    • 如果条件中有or,索引失效
      • 对于多列索引,不是使用的第一部分(第一个),则不会使用索引
        • like “%开头” 会使得索引失效
          • 查询条件中带(计算,函数,(自动或者手动)类型装换)会使索引失效
          • 如有错误,请批评指正
          • 参考
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档