MySQL优化索引失效之症结总结

索引是数据库设计中特殊的数据存储结构,它能使我们的查询效率加倍,合理的使用索引让我们的性能得到质的提升,但是开发过程中,难免各种各样的业务需求可能会导致我们不意间写的SQL语句索引失效,这里整理了一些让索引失效的SQL操作有哪些。
下面是User表结构,主键只有一个id,数据量一共是800w条,根据不同测试条件后续会修改索引。

CREATE TABLE `csdn`.`无标题`  (
  `id` bigint(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `mobile` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `open_id` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `region_id` int(10) NULL DEFAULT NULL,
  `addr` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `sex` tinyint(2) NOT NULL DEFAULT 0 COMMENT '0女1男',
  `state` tinyint(2) NOT NULL DEFAULT 1 COMMENT '0冻结1正常',
  `created_date` datetime(0) NOT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `name`(`name`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 8003859 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

1.Like语句可能会导致失效(注:可能)

前置条件说明      主键:id (B+tree)、name(B+tree)

在这里插入图片描述

百分号放后面,显然是会走索引的。那我们吧百分号放前面试试:
在这里插入图片描述

果然,百分号通配符放前面会导致索引失效,但是所有情况均如此吗?我们继续
在这里插入图片描述

我们把查询列改为name列,这时会走索引,这是因为覆盖索引的缘故,当我们加了索引的列查询的时候刚好也只查询这个列,就不需要回表操作所以这个情况是会走索引的。别急,还有一种情况:
在这里插入图片描述

当我们把查询列改为id和name时,发现也会走索引,而且和上面这种结果一样,这是因为innodb引擎普通索引在命中的时候并不是直接返回结果,而是得到数据行的id,再根据id去主键索引中拿到数据,所以普通索引中会持有主键的id。

2.or关键字可能会导致失效(注:可能)

前置条件说明      主键:id (B+tree)、name(B+tree)
在这里插入图片描述

此时全表扫描没有走索引,因为mobile列没有加索引,or关键字会索引失效。别急,继续往下看:


在这里插入图片描述

此时走了索引,这是因为如果or关键字连接的列都加了索引的话,查询还是会走索引的。

3.索引列进行函数或者运算符操作可能导致失效(注:可能)

前置条件说明      主键:id (B+tree)、name(B+tree)

在这里插入图片描述

在这里插入图片描述

我对id列进行了三角函数和加法运算,此时发现索引失效,当我们采用覆盖索引试试:
在这里插入图片描述

4.索引列使用!= <> 可能会导致失效(注:可能)

前置条件说明      主键:id (B+tree)、name(B+tree)

在这里插入图片描述

可以看见!=操作是会导致索引失效(这里也是可能出现,这个和数据的重复比率相关,只是一般情况下普通索引用!=会失效,特殊情况还是会走),如果采用覆盖索引呢,试试:
在这里插入图片描述

果然,覆盖索引的情况下还是会走索引的。别急,我们看看这一个情况:
在这里插入图片描述

奇怪的事情发生了,如果是主键使用!= 筛选还是会走索引,其实不光是主键索引会有这个情况,唯一索引也会走的,具体原因我后期专门写一个索引博客解释。

5.索引列使用is not null可能导致失效(注:可能)

前置条件说明      主键:id (B+tree)、name(B+tree)
在这里插入图片描述

name采用覆盖索引还是会走的:
在这里插入图片描述

6.索引是字符串类型的列查询不带引号可能会导致失效(注:可能)

前置条件说明      主键:id (B+tree)、name(B+tree)

在这里插入图片描述

我们将它改回来:
在这里插入图片描述

此时当然走索引,当然,如果采用覆盖索引其实还是会走索引的
在这里插入图片描述

7.联合索引不遵循最左匹配原则会导致索引失效

前置条件说明      主键:id (B+tree)、name(B+tree)、(region_id,sex)(B+tree)

在这里插入图片描述

这当然会走索引,即便调换where条件顺序也会走索引的:
在这里插入图片描述

但是如果只有region_id呢?
在这里插入图片描述

答案是会走索引的,别急,我们再看一个情况:
在这里插入图片描述

为什么region_id会走索引,而sex不走呢?答案是region_id和sex的联合索引必须要满足最左匹配原则,也就是说这个(region_id,sex)的联合索引其实可以解释为两个索引的组合:region_id,(region_id,sex),所以如果不满足最左匹配原则就会索引失效。(A,B,C)类型的符合索引,where条件后面如果是A,AB,ABC都可以命中索引。

8.试用not in可能导致失效(注:可能)

前置条件说明      主键:id (B+tree)、name(B+tree)
在这里插入图片描述

如果采用覆盖索引:


在这里插入图片描述

其实这里和!=情况是类似的,如果是主键或者唯一索引试用not in还是会走索引的


在这里插入图片描述

9.外联查询字符集不同意可能导致失效或索引利用率降低

前置条件说明      主键:id (B+tree)、name(B+tree)、mobile(B+tree)
在这里插入图片描述

user表mobile是varchar utf8mb utf8mb4_bin而mobile_des表的mobile是int类型,我们修改一下mobile_des的mobile的编码为utf8和utf8_general_ci


在这里插入图片描述

我们看到索引的利用率是不一样的。

10.优化器认为全表扫描比使用索引更有效率是会失效

这类情况几乎是不大可能发生,但是从逻辑上讲是存在的。当一个列的值存在大量重复时,比如性别,各种状态,当一部分值的数据量几乎碾压性的大于另一个值,优化器认为扫描索引和回表所带来的消耗和全表扫描相差不大时可能出现,但是此类情况和数据库的设计一般不会出现。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354