35 字段类型不匹配 影响 使用索引?

前言

这是一个经常能够看到的问题, 又或者 经常在面试中碰到 

如果 索引字段类型 不匹配, 然后 不会使用索引

这里 我们来看一下 具体的情况 

 

测试表结构如下 

CREATE TABLE `tz_test` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `field1` varchar(128) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  KEY `field1` (`field1`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=10000000 DEFAULT CHARSET=utf8

 

数据信息如下, 接近 1000_0000 条数据 

c13598a8085949638957bc15ba615fcb.png

 

 

根据 id 查询 

explain select * from tz_test where id = 9999999;

explain select * from tz_test where id = '9999999';

可以看到的是 主键 这边 均是使用的索引

203b80247bfd42278e10831fbe748d19.png

e241f96bf4bf459f8d8ef85102100aa0.png

 

执行 “explain select * from tz_test where id = 9999999;” 的时候 

然后 判断使不使用索引的地方在这里, 这类 SYSTEM/CONST 的增加索引查询的处理在这里 

id 字段为 INT, 传入类型为 INT, 然后 这里判断为兼容的索引查询

然后可以使用 id索引 

766ffe9477a349a18e95f62054170304.png

 

然后 下面将 key 传递到 join_tab->keyuse

c9e782f83270484c93eccbfc3e54bfb9.png 

然后 下面根据上下文判断 是否可以使用索引, 这里是可以使用 索引

6a1dff55ca554c6aa72c18435539654a.png 

 

执行 “explain select * from tz_test where id = '9999999';” 的时候 

然后 判断使不使用索引的地方在这里, 这类 SYSTEM/CONST 的增加索引查询的处理在这里 

id 字段为 INT, 传入类型为 STRING, 然后 这里判断为兼容的索引查询

然后可以使用 id索引 

d614e1765a4e45349b787542356022c0.png

 

 

根据 field1 索引字段查询 

然后 我们看一下 field1 字段 

explain select * from tz_test where field1 = 9999999;

explain select * from tz_test where field1 = '9999999';

可以看到 field1 类型不同的时候使用的是 index/all, 类型能够匹配上时 使用的是索引

8294ed1679604abb8fabe3f916b900fc.png

aed4075d80774a62976345de73a641c3.png 

然后 判断不使用索引的地方在这里

字段 field1 类型为 STRING 类型, 比较的右值为 INTEGER 类型, 类型匹配不上, 识别为不能使用 索引比较, 然后 后面 构造的索引树为 NULL, 然后 没有使用索引

这里的类型相关判断 和 上面 SYSTEM/CONST 部分的判断标准一致 

13802918b0c14ef485155e83cf388c3f.png

 

如果是使用索引的查询语句的情况, 这里判断 可以使用索引

bd114c040cab43aba77583aded46c006.png 

然后 下游进入 get_key_scans_params

8a421e8afdcb40fb869b04aa575d872e.png 

然后 下面比较 使用索引, 和 默认的查询方式的一个比较

这里 显然使用索引开销 更小, 然后 选择使用索引

999cb7151aa64b09b1c6b3045be096ce.png

 

如果是 临时字段 或者 临时右值 不使用索引

如果字段是 字符串类, 右值不是字符串类, 不使用索引 

右值类型为 类型为 JSON 不使用索引 

75f0932d34c94196867ea62fbf26f648.png

 

 

tz_test_02 的 根据 id 查询 

为了 更加 深刻的验证 是否使用索引的条件, 我们把 id 和 field1 字段类型调整一下 

id 调整为 varchar, field1 调整为 int 类型 

然后 再来观察一下 情况

CREATE TABLE `tz_test_02` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `field1` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  KEY `field1` (`field1`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=10000000 DEFAULT CHARSET=utf8

 

然后 数据来自于 tz_test

insert into tz_test_02 select * from tz_test;

 

这里 我们仅仅展示一个 explain 的结果, 至于详细情况 请结合上面分析

explain select * from tz_test_02 where id = 9999999;
explain select * from tz_test_02 where id = '9999999';

 

 

可以看到 前者使用了 field1 所在的索引, 全部索引遍历查询了 

这也是基于 field1 所在的索引覆盖了查询条件, 如果增加一个字段, 应该就是 全表扫描了

2a5910397da048409fd5b6ec2f17304e.png

 

后者 “类型兼容”, 因此 直接使用的 主键索引

f46d1808dc2c4d25a18bbaead2edfc0d.png

 

 

tz_test_02 的 根据 field1 查询 

执行 explain 如下 

explain select * from tz_test_02 where field1 = 9999999;
explain select * from tz_test_02 where field1 = '9999999';

 

前者走的是 field1 所在的索引 

b54788b6e3bc46a8aa410302766389bd.png

 

后者 也是使用的 field1 所在的索引 

c741f81a61d8497d82bc6564f1bde4c2.png 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开放领域问答机器人1

开放领域问答机器人是一种智能机器人,它不受限制,可以回答任何问题。这种机器人主要通过自然语言处理技术来理解用户的问题,并从大量的数据中获取相关信息,以提供准确的答案。它的应用领域广泛,包括客户服务、教育、医…

GS3661V1 3.7升压5V 3A SOT23-5封装 外置MOS 升压芯片 单节锂电升压5V 2.5-3A

GS3661V1 3.7升压5V 3A SOT23-5 外置MOS 升压芯片 单节锂电升压5V 2.5-3A

贝锐向日葵亮相云栖大会,携手无影推出全新“云桌面”功能

2023年10月31日-11月2日,一年一度的云栖大会如期举办,本届云栖大会主题为“计算,为了无法计算的价值”,国民级远程控制品牌“贝锐向日葵”亮相云栖大会,参与了以“云电脑”为主题的聚合话题活动。 活动现场&#xff0c…

Vue3组件

组件(Component)是 Vue.js 最强大的功能之一。 组件可以扩展 HTML 元素,封装可重用的代码。 组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的界面都可以抽象为一个组件树: 每个 Vue 应用…

基于SSM的食用菌菌棒溯源系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

广告算法资料汇总【建设中】

业内大佬 阿里妈妈技术 张俊林 王喆 萧瑟 朱小强 综合 付海军:基于互联网广告发展演变和思考(附视频讲解PPT) 广告算法工程师入门_广告与算法的博客-CSDN博客 广告算法学习笔记 20万、50万、100万的算法工程师,到底有什么区别…

Linux编辑器---vim的使用

Vim是一个高度可配置的文本编辑器,它是操作Linux的一款利器,旨在高效地创建和更改任何类型的文本。这款编辑器起源于"vi",并在此基础上发展出了众多新的特性。Vim被普遍推崇为类Vi编辑器中最好的一个,事实上真正的劲敌来…

【算法与数据结构】131、LeetCode分割回文串

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:本题仍然使用回溯算法的一般结构。加入了一个判断是否是回文串的函数,利用起始和终止索引进…

程序员的护城河:技术、创新与软实力的完美融合

作为IT行业的从业者,我们深知程序员在保障系统安全、数据防护以及网络稳定方面所起到的重要作用。他们是现代社会的护城河,用代码构筑着我们的未来。那程序员的护城河又是什么呢?是技术能力的深度?是对创新的追求?还是…

【深度】详细解读与评测OpenAI DevDay的最新API更新与应用

原文:https://www.toutiao.com/article/7299498535408665088/?log_fromd9f79b9fe2182_1699572121760 专注LLM深度应用,关注我不迷路 周二凌晨,全球无数AI科技工作者与极客们翘首以盼的首届OpenAI开发者大会上,仅仅四十分钟的主…

win11下安装odoo17(conda python11)

win11下安装odoo17 odoo17发行了,据说,UI做了很大改进,今天有空,体验一下 打开官方仓库: https://github.com/odoo/odoo 默认的版本已经变成17了 打开odoo/odoo/init.py,发现对python版本的要求也提高了…

Vue的vant notify组件报错Notify is not defined

解决方法: 原创作者:吴小糖 创作时间:2023.11.10

sCrypt 现在支持 Ordinals 了

比特币社区对 1Sat Ordinals 的接受度正在迅速增加,已有超过 4800 万个铭文被铸造,这一新创新令人兴奋不已。 尽管令人兴奋,但 Ordinals 铭文的工具仍然不发达,这使得使用 Ordinals 进行构建具有挑战性。 更具体地说,缺…

一文读懂RestCloud AppLink

RestCloud AppLink是什么? RestCloud AppLink 是一种应用程序集成解决方案,它提供了一套工具和技术,用于实现不同应用程序之间的无缝集成和交互。平台旨在解决企业中应用程序之间数据孤岛、信息孤立和业务流程不畅的问题,提高企业…

【数据结构】单链表之--无头单向非循环链表

前言:前面我们学习了动态顺序表并且模拟了它的实现,今天我们来进一步学习,来学习单链表!一起加油各位,后面的路只会越来越难走需要我们一步一个脚印! 💖 博主CSDN主页:卫卫卫的个人主页 &#x…

云计算:未来世界的超级英雄

在这个充满奇妙的时代,云计算被赋予了超级英雄的力量。它以其高效、可靠的数据处理能力,成为了推动智能科技发展的核心引擎。想象一下,你的智能家居设备能够通过云计算与你互动,根据你的需求智能调节温度、照明、音乐,…

数据库安全:MySQL 身份认证漏洞(CVE-2012-2122)

数据库安全:MySQL 身份认证漏洞(CVE-2012-2122) MySQL 身份认证漏洞是一个身份认证绕过漏洞,该漏洞的核心原理涉及到 MySQL 在处理身份认证时的一个安全缺陷,这个漏洞可以使攻击者可以绕过安全身份认证,从…

YOLOv8模型ONNX格式INT8量化轻松搞定

ONNX格式模型量化 深度学习模型量化支持深度学习模型部署框架支持的一种轻量化模型与加速模型推理的一种常用手段,ONNXRUNTIME支持模型的简化、量化等脚本操作,简单易学,非常实用。 ONNX 模型量化常见的量化方法有三种:动态量化…

DCMM咨询评估官方解答及各地补贴政策!

1、DCMM是什么? DCMM是国家标准GB/T 36073-2018《数据管理能力成熟度评估模型》(Data management Capability Maturity Model)的简称,是我国数据管理领域首个正式发布的国家标准,旨在帮助企业利用先进的数据管理理念和…

jeecgboot vue3使用JAreaSelect地区选择组件时返回省市区的编码,如何获取到选择地区的文字

JAreaSelect文档地址:添加链接描述 当我们的BasicForm表单组件中使用选择省市区的JAreaSelect组件时,获取到的返回值是地区的编码,如“530304”这样子,但我在小程序中展示数据的时候需要明确的地址,如“云南省昆明市五…