like左匹配索引失效_Mysql索引失效的情况

一、前提条件

1、创建三张测试表:

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (

`id`int(11) NOT NULL,

`name` varchar(25) DEFAULT NULL,

`age`int(11) NOT NULL DEFAULT 0,

`update_time` datetime DEFAULT NULL,

`first_name` varchar(25) DEFAULT NULL,

`last_name` varchar(25) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `user` (`id`, `name`, `age`,`update_time` ,`first_name` ,`last_name`) VALUES (1,'张三',23,'2020-12-22 15:27:18','张','三'), (2,'李四',24,'2020-06-21 15:27:18','李','四'), (3,'王五',25,'2020-07-20 15:27:18','王','五');

DROP TABLE IF EXISTS `role`;

CREATE TABLE `role` (

`id`int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(10) DEFAULT NULL,

PRIMARY KEY (`id`),

KEY `index_name` (`name`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `role` (`id`, `name`) VALUES (1,'产品经理'),(2,'技术经理'),(3,'项目总监');

DROP TABLE IF EXISTS `role_user`;

CREATE TABLE `role_user` (

`id`int(11) NOT NULL,

`role_id`int(11) NOT NULL,

`user_id`int(11) NOT NULL,

PRIMARY KEY (`id`),

KEY `index_role_user_id` (`role_id`,`user_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `role_user` (`id`, `role_id`, `user_id`) VALUES (1,2,1),(2,1,2),(3,3,3);

2、创建对应的索引:

mysql>ALTER TABLE user ADD INDEX index_name (name);

Query OK,0 rows affected (0.03sec)

Records:0 Duplicates: 0 Warnings: 0

mysql>ALTER TABLE user ADD INDEX index_age (age);

Query OK,0 rows affected (0.02sec)

Records:0 Duplicates: 0 Warnings: 0

mysql>alter table user add index index_first_last_name (first_name,last_name);

Query OK,0 rows affected (0.12sec)

Records:0 Duplicates: 0 Warnings: 0

二、索引失效情况

最常说的like匹配;

强制类型转换会让索引失效;

最左匹配原则(组合索引按照建立的顺序,如果前一个匹配不上就会导致后一个命中失效);

WHERE 条件中使用or即使有索引也会失效;

1、最常说的like匹配

例1 explain select * from user where name like '%张';

例2 explain select * from user where name like '张%';

【结论:】例1索引失效 ,例2索引生效(匹配列前缀 '张%')

2. 强制类型转换会让索引失效

首先明确一点mysql优化器自动进行强制类型转换;也就是下面这两个sql都能查询到结果。

select * from user where name = '6';

select * from user where name = 6;

例1:explain select * from user where name = '6';

例2:explain select * from user where name = 6;

【 结论:】因为name在数据库的类型为:varchar,例2当mysql优化器自动进行强制类型转换时,索引失效;

3.最左匹配原则

例1: explain select * from user where first_name = '王' and last_name = '五';

例2: explain select * from user where last_name = '五' and first_name = '王';

例3 :explain select * from user where first_name = '王';

例4 :explain select * from user where last_name = '五';

【结论:】当建立一个组合索引时,根据例1和例2 得出 组合索引 where条件后面的排放顺序不会影响索引的命中;

根据例3 例4 得出如果组合索引中有部分字段缺失(因为建立索引的顺序是first_name ,last_name),按照建索引的顺序从左到右,依次匹配如果前一个                    列不匹配,则后一个列索引失效。

4. where条件中使用or即使有索引也会失效

例1:explain select * from user where name = '张三' or update_time = '2020-07-20 15:27:18';

例2:explain select * from user where update_time = '2020-07-20 15:27:18' or  name = '张三';

例3:explain select * from user where name = '张三' or age = 25;

【结论:】通过例1和例2可以得出如果条件中or的两边有一个没有建立索引就会导致索引失效;通过例3可以到,如果or两边字段都建立了索引,索引不会失效。

以上只是个人的一些简单总结 ,如果有什么问题希望指出,如果有什么问题可以一起讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329426.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于DDDLite的权限管理OpenAuth.net 1.0版正式发布

距离上一篇OpenAuth.net的文章已经有5个多月了,在这段时间里项目得到了很多朋友的认可,开源中国上面的Star数接近300,于是坚定了我做下去的信心。最近稍微清闲点,正式推出1.0版,并在阿里云上部署了一个在线演示&#x…

24.原生磁盘的使用

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐; 2.磁盘操作抽象 第1层抽象:通过盘块号读写磁盘(或逻辑盘块号);第2层抽象:用队列缓存多个…

Oracle入门(十三C)之高级查询(下)

上章:Oracle入门(十三B)之高级查询(上) 四、常见组函数 SUM、AVG、COUNT、MIN、MAX分组函数忽略null 值。不能在WHERE 子句中使用组函数。MIN 和MAX 可用于任何数据类型;SUM、AVG只能用于数字数据类型五、子…

微软将降低Visual Studio对操作系统的影响

在过去几年中,为了将Visual Studio变成Windows上的第一开发工具,而不管用户的目标平台是什么,微软作出了重大努力。最近收购Xamarin及通过大力支持开源工具来支持非Windows设备,极大地增加了它对于各类开发人员的用处。这一做法的…

代码设置margintop_关于元素设置margin-top能够改变body位置的原因及解决(子元素设置margin-top改变父元素定位)...

关于元素设置margin-top能够改变body位置的原因及解决(子元素设置margin-top改变父元素定位)起因:在进行bootstrap的.navbar-brand内文字设置垂直居中时采用line-height高度,无法居中,发现源码.navbar-brand 设置了 padding: 15px 15px;(默认…

Oracle入门(九A)之用户的权限或角色

转载自 查看Oracle用户的权限或角色 前几天被问到一些关于权限和角色的问题,今天抽时间总结一下如何查看Oracle用户的权限或角色,在之前的博文中,写过 SYS,SYSTEM,DBA,SYSDBA,SYSOPER的区别与联系 以及 Oracle中定义者权限和调用者权限案例分…

25.从生磁盘到文件

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐; 2.文件:煮熟的磁盘,或熟磁盘; 本节的主要内容是讨论 如何从文件得到盘块号; 3.磁盘操作抽象&#xf…

Storm 1.0.1发布 .NET 适配也已到来

Apache Storm 1.0.0刚发布不久,1.0.1版本也在几天前到来;该版本主要是完成一些BUG修复和小的改进,通过一段时间新版本的使用,特将个人感受和一些遇到的问题归纳如下;另外 .NET 版本的 Storm 适配器也已经发布&#xff…

布隆过滤器速度_详解布隆过滤器的原理、使用场景和注意事项

今天碰到个业务,他的 Redis 集群有个大 Value 用途是作为布隆过滤器,但沟通的时候被小怼了一下,意思大概是 “布隆过滤器原理都不懂,还要我优化?”。技术菜被人怼认了、怪不得别人,自己之前确实只是听说过这…

Oracle入门(十四)之PL/SQL

一、PL/SQL 基本语法 PL/SQL语言是模块式的过程化SQL,是oracle公司对SQL的扩展。 (1)(2)(3)(5)(6)(7)数据类型Number 数字型Varchar2 …

26.文件使用磁盘的代码实现

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐; 2.文件内容复习: 1)如何从生磁盘抽象为文件? 核心是从字符流位置算出盘块号;2)如何算出盘…

.NET Core全新的配置管理[共9篇]

提到“配置”二字,我想绝大部分.NET开发人员脑海中会立马浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我们已经习惯了将结构化的配置信息定义在这两个文件之中。到了.NET Core的时候,很多我们…

redis存opc_KEPServerEX6完整免费版

KEPServerEX6完整免费版是一款先进的连接平台,主要用于为您的应用程序提供单一来源的工业自动化数据,通过连接、管理、监视和控制不通的自动化设备和应用程序来实现工业数据。具有严谨的技术特征,支持多达250种以上的通讯协定,可连…

Oracle入门(十四B)之PL/SQL异常处理

定义:程序执行过程的警告或错误成为例外(Exception) 一、常见预定义错误 二、非预定义错误及用户定义错误 (1)非预定义oracle错误其他标准的oracle错误,可以自定义异常名,将其与指定oracle错误关联,由系统触发。 例子…

C#读书雷达 | TW洞见

大家都知道,ThoughtWorks的技术雷达每年都会发布两到三次,它不但是业界技术趋势的标杆,更提供了一种卓有成效的方法论,即打造自己的技术雷达。在这种思想的驱动下,我们诞生了自己的读书雷达。但这份雷达略显high level…

27.目录与文件系统

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐; 2.第4层抽象:抽象整个磁盘到文件系统 【1】文件系统,抽象整个磁盘(第4层抽象) 【图解】整个磁盘抽象1…

dd命令打包多个文件_linux的tar命令详情;linux多个文件压缩打包到一个压缩文件...

tar命令可以用来压缩打包单文件、多个文件、单个目录、多个目录。Linux打包命令_tartar命令可以用来压缩打包单文件、多个文件、单个目录、多个目录。常用格式:单个文件压缩打包 tar czvf my.tar.gz file1多个文件压缩打包 tar czvf my.tar.gz file1 file2,...(file…

28.文件目录解析代码实现

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐; 背景: 磁盘格式化后,其组成部分包括引导块,超级块,inode使用位图,盘块使用位图&#xff0…

Oracle入门(十四A)之PL/SQL 基本结构

一、条件控制语句 &#xff08;1&#xff09;条件语句Iif…then…end if形式1:if <布尔表达式> then…(pl/sql和sql)…end if;&#xff08;2&#xff09;条件语句II if…then…else … end if 形式2&#xff1a;if <布尔表达式> then…(pl/sql和sql)else…end if;…

利用记事本创建一个ASP.NET Core RC2 MVC应用

步骤一、安装最新的.NET Core SDK 我们可以根据自身的操作系统环境从https://github.com/dotnet/cli上下载.NET Core最新的SDK&#xff0c;这个SDK包含.NET Core Runtime和一些有用工具&#xff08;比如命令行&#xff09;。如果你已经安装了老旧的版本&#xff0c;我个人建议你…