当前位置: 首页 > news >正文

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

文章目录

  • 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 = InnoDBCHARACTER SET = utf8mb4COLLATE = utf8mb4_0900_ai_ciROW_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'; # 返回0select 0 = 'a'; # 返回1select 2 = '2'; # 返回1select 0 = '聂可以'; # 返回1select 1 = '+1'; # 返回1select -1 = '-1'; # 返回1select 10 = '+10a'; # 返回1select 10 = '10a'; # 返回1select 1 = 'a1'; # 返回0select 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 时,会导致索引失效

相关文章:

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

文章目录 1. 问题引入2. 准备工作3. 案例分析3.1 正常情况3.2 发生了隐式类型转换的情况 4. MySQL隐式类型转换的规则4.1 案例引入4.2 MySQL 中隐式类型转换的规则4.3 验证 MySQL 隐式类型转换的规则 5. 总结 如果对 MySQL 索引不了解,可以看一下我的另一篇博文&…...

数据治理的意义

数据治理是一套管理数据资产的流程、策略、规则和控制措施,旨在确保数据的质量、安全性、可用性和合规性。数据治理的目标通常包括但不限于以下几点: 1. **提高数据质量**:确保数据的准确性、一致性、完整性和可靠性。 2. **确保数据安全**…...

快手游戏服务端C++开发一面-面经总结

1、tcp的重传机制有哪几种?具体描述一下 最基本的超时重传 超过时间就会重传 三个重复ACK 快速重传 减少等待超时、 接收方可以发送选择性确认 不用重传整段 乱序到达 可以通知哪些丢失 重复数据重传 2、override和final? override可写可不写 写出来就…...

git的学习使用(认识工作区,暂存区,版本区。添加文件的方法)

学习目标: 学习使用git,并且熟悉git的使用 学习内容: 必备环境:xshell,Ubuntu云服务器 如下: 搭建 git 环境认识工作区、暂存区、版本区git基本操作之添加文件(1):gi…...

Series数据去重

目录 准备数据 Series数据去重 DataFrame数据和Series数据去重对比 在pandas中,Series.drop_duplicates(keep, inplace)方法用于删除Series对象中的重复值。 keep: 决定保留哪些重复值。可以取以下三个值之一: first(默认值&…...

Python语言核心12个必知语法细节

1. 变量和数据类型 Python是动态类型的,变量不需要声明类型。 python复制代码 a 10 # 整数 b 3.14 # 浮点数 c "Hello" # 字符串 d [1, 2, 3] # 列表 2. 条件语句 使用if, elif, else进行条件判断。 python复制代码 x 10 if x > 5: print(&q…...

解决ImageIO无法读取部分JPEG格式图片问题

解决ImageIO无法读取部分JPEG格式图片问题 问题描述 我最近对在线聊天功能进行了一些内存优化,结果在回归测试时,突然发现有张图片总是发送失败。测试同事把问题转到我这儿来看,我仔细检查了一下,发现是上传文件的接口报错&#…...

使用three.js 实现蜡烛效果

使用three.js 实现蜡烛效果 import * as THREE from "three" import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js"var scene new THREE.Scene(); var camera new THREE.PerspectiveCamera(60, window.innerWidth / window.in…...

手动在Linux服务器上部署并运行SpringBoot项目(新手向)

背景 当我们在本地开发完应用并且测试通过后,接着就要部署在服务器上启动。 步骤 1.先用maven将SpringBoot应用当成jar包 2.生成jar文件并复制此文件 3.xshell远程连接linux服务器,在xftp将文件粘贴到linux服务器,这里我放在/usr/local…...

自媒体短视频如何制作?

从0到1打造爆款短视频!300条视频创作经验分享,助你玩转自媒体! 想用短视频玩转自媒体却不知道从何下手?别担心!从21年开始接触短视频的我,断断续续创作了300多条视频,踩过不少坑,也收获了一些心得,核心秘诀就是:账号内容垂直化 + 明确受众群体! 我将从主题确定、脚本…...

2024年河南省职业技能竞赛(网络建设与运维赛项)

模块二:网络建设与调试 说明: 1.所网络设备在创建之后都可以直接通过 SecureCRT 软件 telnet 远程连接操作。 2.要求在全员化竞赛平台中保留竞赛生成的所有虚拟主机。 3.题目中所有所有的密码均为 Pass-1234,若未按照要求设置,涉 …...

git--git reset

HEAD 单独一个HEAD eg:git diff HEAD 表示当前结点。 HEAD~ HEAD~只处理当前分支。 注意:master分支的上一个结点是tmp分支的所在的结点fc11b74, 79f109e才是master的第二个父节点。 HEAD~ 当前结点的父节点。 HEAD~1 当前结点的父节点。 HEAD~n 当前结点索…...

Spring Boot的实用内置功能详解

Spring Boot作为一款备受欢迎的Java框架,以其简洁、高效和易用的特点,赢得了广大开发者的青睐。其内置的多种功能更是为开发者提供了极大的便利,本文将详细介绍Spring Boot中记录请求数据、请求/响应包装器、特殊的过滤器Filter以及Controlle…...

撸猫变梳毛?怎么解决猫咪掉毛问题?好用的宠物空气净化器推荐

秋风一吹,新一轮的猫咪换毛季又到了,这也意味着我失去了撸猫自由。我每天的治愈方式就是下班撸猫,抚摸着柔软的毛发,好像一天的烦恼都消除了。可是一到换毛季,猫还没撸两下,先从猫咪身上带下一手毛&#xf…...

人声分离免费软件,六款好用软件处理音乐更轻松!

在这个数字化音乐时代,无论是专业音乐人还是音乐爱好者,都渴望在创作与编辑过程中拥有更多便捷高效的工具。人声分离技术,作为音乐后期制作中的一项关键技术,能够精准地将歌曲中的人声与伴奏分离,极大地拓宽了音乐创作…...

数据分析Power BI设置万为单位的数据

玩过Power BI的同学都知道,power BI在度量值设置单位里,唯独没有万这个单位,但是我们可以自定义,操作过程如下: 1.用DAX新建单位表 单位 SELECTCOLUMNS( { ( "元", 1), ("万",10000), ("千…...

(AI 生成) 新时代游击方式: 利用 “灵活就业“ 红利

注意: 本文内容为 AI 大模型生成, 仅供参考. 提示词: 写一篇短文, 500 字左右, 标题为: 新时代游击方式: 利用 “灵活就业” 红利 1 豆包 《新时代游击方式:利用“灵活就业”红利》 在新时代的大舞台上,“灵活就业”犹如一块熠熠生辉的宝藏&#xff0c…...

Unity UndoRedo(撤销重做)功能

需求 撤销与重做功能 思考 关于记录的数据的两点思考: 记录操作记录影响显示和逻辑的所有数据 很显然这里就要考虑取舍了: 记录操作 这种方案只需要记录每一步的操作,具体这个操作要怎么渲染和实现出来完全需要自己去实现,这…...

28条有关人工智能的名言

当谈到人工智能(AI)的潜力和潜在风险,以及无人类干预的机器学习和推理过程时,目前尚存在许多不同的观点。 只有时间会告诉我们,这些语录中哪一条是最接近未来的真实情况的。在我们尚未到达目的地之前,想一想…...

搞机器视觉项目看不起搞机器视觉培训的,实际上怎么样

搞机器视觉项目第一要务就是验收回款,往往欠款的非常严重,多数还要打通人际关系需要大量的成本。大多数机器视觉检测项目具有一定的风险,客户要求不明确,技术评估不充分,往往伴随着失败的可能性。所以做项目又累又担风…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异&#xff…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM&#xff09…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成&#xff0c;具体方法取决于设备类型&#xff08;如USB麦克风、3.5mm接口麦克风或HDMI音频输入&#xff09;。以下是详细指南&#xff1a; 1. 连接音频输入设备 USB麦克风/声卡&#xff1a;直接插入树莓派的USB接口。3.5mm麦克…...

Vue 模板语句的数据来源

&#x1f9e9; Vue 模板语句的数据来源&#xff1a;全方位解析 Vue 模板&#xff08;<template> 部分&#xff09;中的表达式、指令绑定&#xff08;如 v-bind, v-on&#xff09;和插值&#xff08;{{ }}&#xff09;都在一个特定的作用域内求值。这个作用域由当前 组件…...

华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)

题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...