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

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

索引失效情况(MySQL5.7.24)


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


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都建立了索引,还是失效的,这个地方可以注意一下。


15.png


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


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


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


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”


16.png


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


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


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)


17.png


如有错误,请批评指正

目录
相关文章
|
6月前
|
SQL Oracle 关系型数据库
分析索引失效的几种情况
联合索引 is not null 只要在建立的索引列(不分先后)都会走, in null时 必须要和建立索引第一列一起使用,当建立索引第一位置条件是is null 时,其他建立索引的列可以是is null(但必须在所有列 都满足is null的时候),或者=一个值; 当建立索引的第一位置是=一个值时,其他索引列可以是任何情况(包括is null =一个值),以上两种情况索引都会走。其他情况不会走。
101 1
|
6月前
|
SQL Oracle 关系型数据库
索引失效的情况分析
大家都知道,一条查询语句走了索引和没走索引的查询效率是非常大的,在我们建好了表,建好了索引后,但是一些不好的sql会导致我们的索引失效,下面介绍一下索引失效的几种情况
43 0
|
2月前
|
存储 关系型数据库 MySQL
MySQL索引失效及避免策略:优化查询性能的关键
MySQL索引失效及避免策略:优化查询性能的关键
298 3
|
6月前
|
SQL 关系型数据库 MySQL
14. 什么情况下索引会失效 ?
了解 MySQL 索引失效的情况对优化 SQL 查询至关重要。避免在列上使用函数、运算、!=、not in、OR 和 %value% LIKE 操作,以保持索引有效性。使用组合索引代替多个单列索引,防止范围查询后的列无法使用索引。注意,NULL 值、列类型不匹配和隐式转换也可能导致索引失效。
88 0
|
6月前
|
SQL 关系型数据库 MySQL
索引失效的10中场景
索引失效的10中场景
|
SQL 存储 大数据
案例12-数据类型不一致导致索引失效
数据类型不一致导致索引失效
170 0
|
存储 SQL Oracle
Oracle优化避免索引失效
Oracle优化避免索引失效
362 0
|
存储 关系型数据库 MySQL
教你优雅的实现索引失效
教你优雅的实现索引失效
88 0
|
关系型数据库 MySQL 索引
索引失效的情况
索引失效的情况
80 0
|
存储 SQL 搜索推荐
索引失效案例
索引失效案例
索引失效案例