MySQL中什么情况下类型转换会导致索引失效

news2024/11/30 6:39:52

文章目录

  • 1. 问题引入
  • 2. 准备工作
  • 3. 案例分析
    • 3.1 正常情况
    • 3.2 发生了隐式类型转换的情况
  • 4. MySQL隐式类型转换的规则
    • 4.1 案例引入
    • 4.2 MySQL 中隐式类型转换的规则
    • 4.3 验证 MySQL 隐式类型转换的规则
  • 5. 总结

如果对 MySQL 索引不了解,可以看一下我的另一篇博文: MySQL-进阶篇-索引(索引概述、索引的结构、索引的分类、索引的语法、性能分析工具、索引的使用规则、索引的设计原则)

1. 问题引入

我们知道,在 MySQL 中,如果发生了隐式类型转换,有可能会导致索引失效,那什么情况下隐式类型转换会导致索引失效呢

2. 准备工作

我们创建一张名为 test 的表,探究什么情况下隐式类型转换会导致索引失效

  • a 字段是 int 类型,b 字段是 varchar 类型
  • a 字段和 b 字段都建立了索引

在这里插入图片描述

DROP TABLE IF EXISTS `test`;

CREATE TABLE `test`
(
    `a` int                                                           NULL DEFAULT NULL,
    `b` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
    INDEX `inx_a` (`a` ASC) USING BTREE,
    INDEX `idx_b` (`b` ASC) USING BTREE
) ENGINE = InnoDB
  CHARACTER SET = utf8mb4
  COLLATE = utf8mb4_0900_ai_ci
  ROW_FORMAT = Dynamic;

3. 案例分析

3.1 正常情况

我们先来看正常的情况下,也就是没有发生隐式类型转换的情况下,索引是否生效

explain
select *
from test
where a = 1;

explain
select *
from test
where b = '1';

第一条 SQL 语句的执行结果

在这里插入图片描述

第二条 SQL 语句的执行结果

在这里插入图片描述

可以看到,正常情况下 idx_a 索引和 idx_b 索引都生效了

3.2 发生了隐式类型转换的情况

接下来我们看一下发生了隐式类型转换的情况下索引是否生效

explain
select *
from test
where a = '1';

explain
select *
from test
where b = 1;

第一条 SQL 语句的执行结果

在这里插入图片描述

第二条 SQL 语句的执行结果

在这里插入图片描述

可以看到,第一条 SQL 语句走了索引,但是第二条 SQL 语句却没有走索引

为什么呢,同样是发生了隐式类型转换,为什么 a 字段对应的索引生效了,但是 b 字段对应的索引却失效了

要解答这个问题,我们需要知道 MySQL 隐式类型转换的规则

4. MySQL隐式类型转换的规则

4.1 案例引入

我们通过几个例子来理解 MySQL 隐式类型转换的规则

在这里插入图片描述

select 1 = 'a';

select 0 = 'a';

select 2 = '2';

select 0 = '聂可以';

select 1 = '+1';

select -1 = '-1';

select 10 = '+10a';

select 10 = '10a';

select 1 = 'a1';

select 10 = '1a0';

以上 select 语句的输出结果(结果返回 1 表示条件成立,返回 0 表示条件不成立)

在这里插入图片描述

select 1 = 'a'; # 返回0

select 0 = 'a'; # 返回1

select 2 = '2'; # 返回1

select 0 = '聂可以'; # 返回1

select 1 = '+1'; # 返回1

select -1 = '-1'; # 返回1

select 10 = '+10a'; # 返回1

select 10 = '10a'; # 返回1

select 1 = 'a1'; # 返回0

select 10 = '1a0'; # 返回0

以下几个 SQL 语句返回 1 不难理解,因为字符串转换为数字后确实与要比较的数字相等

  • select 2 = ‘2’; # 返回1

  • select 1 = ‘+1’; # 返回1

  • select -1 = ‘-1’; # 返回1

但是以下几个 SQL 语句的结果就有点费解了

  • select 0 = ‘聂可以’; # 返回1
  • select 10 = ‘10a’; # 返回1

4.2 MySQL 中隐式类型转换的规则

要搞明白上述几个例子,我们需要知道 MySQL 中隐式类型转换的规则,在 MySQL 中

  1. 当字符串转换为数值时,如果字符串是合法数字开头的,会尝试将字符串转换为数值类型,如果字符串是合法数字开头,但整个字符串又不是完全合法的数字,则只会转换字符串开头的合法数字部分
  2. 如果字符串不是以合法数字开头,那么转换结果为 0
  3. 发生类型转换时,绝大多数情况是从字符串转换为数值,而不是从数值转换为字符串,(只有极少数情况是从数值转换为字符串,例如使用 concat 函数将数值和字符串拼接成一个新的字符串时)
select 123 + '456';

在这里插入图片描述

select concat(123, '456');

在这里插入图片描述


知道 MySQL 中隐式类型转换的规则后,再次理解上述例子,就比较容易了

  • ‘a’ 是非数值类型的字符串,转换为数值后的值为 0
  • ‘聂可以’ 是非数值类型的字符串,转换为数值后的值为 0
  • ‘10a’ 字符串的前面部分合法,转换为数值后的值为 10
  • ‘1a0’ 字符串的前面部分合法,转换为数值后的值为 1(转换过程中如果遇到非法字符就会停止转换过程)

我们再次分析最初的例子

explain
select *
from test
where a = '1';

explain
select *
from test
where b = 1;

a 字段是 int 类型, ‘1’ 是字符串类型,类型不匹配,发生隐式类型转换,也就是将字符串 ‘1’ 转换成数值,再与数值 1 比较,这个转换过程并没有破坏索引树的结构,索引会生效

b 字段是 varchar 类型, 1 是数值类型,类型不匹配,发生隐式类型转换,也就是将每一行记录中的 b 字段都转换为数值,再与数值 1 进行比较,这个转换过程破坏了索引树的结构,索引不会生效

4.3 验证 MySQL 隐式类型转换的规则

我们往表中插入两条数据

insert into test
values (1, 'NieKeYi');

insert into test
values (2, '2024年10月13日');

执行以下 select 语句,验证 MySQL 隐式类型转换的规则


select *
from test
where b = 0;

查询结果如下

在这里插入图片描述


select *
from test
where b = 2024;

查询结果如下

在这里插入图片描述


select *
from test
where a = '2a';

查询结果如下

在这里插入图片描述

5. 总结

当数据库表的字段为 varchar 类型,而传入数据的类型为 int 时,会导致索引失效

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

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

相关文章

Hadoop集群安装

集群规划 node01node02node03角色主节点从节点从节点NameNode√DataNode√√√ResourceManager√NodeManager√√√SecondaryNameNode√Historyserver√ 上传安装包到node01 解压到指定目录 tar -zxvf /bigdata/soft/hadoop-3.3.3.tar.gz -C /bigdata/server/ 创建软链接 cd…

在线matlab环境

登陆https://ww2.mathworks.cn/ 在线文档https://ww2.mathworks.cn/help/index.html 在线环境[需要先登陆]

C4T避风型电动采光排烟天窗(图集09J621-2)

C4T避风型电动采光排烟天窗是09J621-2《电动采光排烟天窗》图集中的一种窗型。也是一种现代化的建筑消防排烟通风采光设备,被广泛应用于多风地区厂房。 C4T避风型电动采光排烟天窗配有成品避风罩,该避风置由钢制骨架和彩色钢板构成,固定在电动…

50 | 装饰器模式:通过剖析Java IO类库源码学习装饰器模式

上一篇文章我们学习了桥接模式,桥接模式有两种理解方式。第一种理解方式是“将抽象和实现解耦,让它们能独立开发”。这种理解方式比较特别,应用场景也不多。另一种理解方式更加简单,类似“组合优于继承”设计原则,这种…

openEuler、Linux操作系统常见操作-(6)如何登录Linux

如何登录Linux Linux登陆方式主要有如下两种: 。本地登陆 。一个典型的Linux系统将运行六个虚拟控制台和一个图形控制台,openEuler目前暂未支持图形化界面; 可以通过CtrlAltF[1-6]在6个虚拟控制台之间进行切换。 远程登录 。默认情况下openEuler支持远程登录&…

制作PPT的入门步骤有哪些?2个高效软件轻松搞定PPT!

对于现代的职场人士和学生来说,PPT——PowerPoint已经成为他们工作和学习无法避开的部分,换到各种商业会议、学术报告和教学中,PPT演示文稿都扮演着重要的角色:不仅能够帮助演讲者更好地展示讲义内容,更让观众能够通过…

JavaScript全面指南(四)

​🌈个人主页:前端青山 🔥系列专栏:JavaScript篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来JavaScript篇专栏内容:JavaScript全面指南 目录 61、如何防止XSRF攻击 62、如何判断一个对象是否为数组&…

科研绘图系列:R语言散点相关系数图(scatter plot)

文章目录 介绍加载R包数据函数画图系统信息介绍 散点相关系数图是一种数据可视化图表,它结合了散点图和相关系数来展示两个连续变量之间的关系。这种图表通常用于相关性分析,以判断两个变量之间是否存在某种关联,并总结坐标点的分布模式。 在散点相关系数图中,横轴和纵轴…

SpringBoot+Vue+Uniapp智能社区服务小程序系统(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

截图贴图工具 | PixPin v1.9.0 绿色版

PixPin是一款功能强大且使用简单的截图和贴图工具,它旨在帮助用户提高工作效率。PixPin的主要功能包括截图、贴图、标注、文本识别、长截图和截动图。它允许用户自由选择或自动探测窗口来设定截图范围,精准截取所需内容,并将所截取的图像“贴…

D37【python 接口自动化学习】- python基础之函数

day37 函数的参数 学习日期:20241014 学习目标:输入输出与文件操作﹣-50 函数的参数:怎样实现函数与外部数据通信? 学习笔记: 实参与形参 代码实现 # 实参与形参 def foo(number):print(number)n1123 n…

redis与springBoot整合

前提 要实现,使用Redis存储登录状态 需要一个完整的前端后端的项目 前端项目搭建 解压脚手架 安装依赖 配置请求代理 选做: 禁用EsLint语法检查 Vue Admin Template关闭eslint校验,lintOnSave:false设置无效解决办法_lintonsave: false-CSDN博客 …

【前端】如何制作一个简单的网页(3)

接下来我们为html元素添加网页内容。网页内容按照功能的不同可以区分为网页头与网页体两个部分。 先来说说什么是网页头。 网页头 网页头(又称为网页头部信息)向浏览器提供文档的一些信息。 这些信息包括网页的名称、编码方式、样式、JS代码等。 &…

java项目之纺织品企业财务管理系统源码(springboot+vue+mysql)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的纺织品企业财务管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 基于spring boot…

Thread类的基本用用法

1.创建线程 1.1继承Thread类 线程创建需要Thread类但是不需要import导入是为什么? 因为java.lang默认import不需要导入,java.lang中包含Thread 为什么在MyThread类中只能使用try catch 无法使用throws? 因为父类Thread run中没有throws …

Java 日志打印

使用日志打印: private static Logger log LoggerFactory.getLogger(DeptController.class);RequestMapping("/depts")public Result list() { // System.out.println("查询全部部门数据");log.info("查询全部部门数据");ret…

Spring Boot:为中小型医院网站提速

3 系统分析 3.1 可行性分析 通过对本基于Spring Boot的中小型医院网站实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、操作可行性、经济可行性和时间可行性四方面进行分析。 3.1.1 技术可行性 本基于Spring Boot的中小型…

[LeetCode] 118. 杨辉三角

给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1]] 示例 2: 输入: numRows 1 输出: [[1…

【计网】从零开始理解UDP协议 --- 理解端口号和UDP结构

我依旧敢和生活顶撞, 敢在逆境里撒野, 直面生活的污水, 永远乐意为新一轮的月亮和日落欢呼。 --- 央视文案 --- 从零开始理解UDP协议 1 再谈端口号2 理解UDP 报头结构3 UDP 的特点4 UDP 的缓冲区5 UDP 使用注意事项 1 再谈端口号 之前我…

个性化图像生成新SOTA!阿里开源MIP-Adapter,可将无需微调的IP-Adapter推广到同时合并多个参考图像。

今天给大家介绍阿里最近开源的个性化图像生成的新方法MIP-Adapter,将无需微调的预训练模型(IP-Adapter)推广到同时合并多个参考图像。MIP-Adapter会根据每个参考图像与目标对象的相关性来给这些图像分配不同的“重要性分数”。这样&#xff0…