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

news2024/9/19 10:39:21

前言

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

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

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

 

测试表结构如下 

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 

 

 

 

 

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

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

相关文章

接口自动化测试之Fiddler使用教程

一、Fiddler 简介 Fiddler工具介绍 Fiddler是一个通过代理的方式来进行抓包工具,运行时会在本地建立一个代理服务,默认地址:127.0.0.1:8888。Fiddler开启之后,配置本机代理,再打开IE浏览器,IE的PROXY会自…

C语言与C++的区别和联系

C语言和C到底是什么关系? 首先C和C语言本来就是两种不同的编程语言,但C确实是对C语言的扩充和延伸,并且对C语言提供后向兼容的能力。对于有些人说的“C完全就包含了C语言”的说法也并没有错。 C一开始被本贾尼斯特劳斯特卢普(Bja…

身份证读取器手持机 二代证核验手持终端 身份证核查手持机

身份证手持机外观比较小巧,方便携带,支持条码识别、人脸识别、NFC卡刷卡、内置二代证加密模块,可离线采集和识别二代身份证,进行身份识别。信息读取更便捷、安全高效。采用IP65高防护等级,1.5M防摔,可以适应…

SmartBear正式收购Stoplight,并计划在核心API设计、文档和门户产品中集成其功能

不久前,软件开发和可视化工具提供商SmartBear正式宣布收购全球领先的API设计公司Stoplight。这一收购是为了打造业内最全面的API开发平台,为寻求现代化API实践的开发团队提供更好的透明度、自动化与生产力。将Stoplight在API方面的优势(包括治…

Linux驱动应用层与内核层之间的数据传递

摘要 本文将深入探讨在Linux驱动中,应用层与内核层之间数据传递的机制和优化策略。我们将详细解析这一过程中的各个步骤,包括数据从应用层到内核层的传输,以及从内核层返回应用层的过程。此外,我们将提出并评估一系列可能的优化策…

Docker+K8s基础(重要知识点总结)

目录 一、Docker的核心1,Docker引擎2,Docker基础命令3,单个容器运行多个服务进程4,多个容器运行多个服务进程5,备份在容器中运行的数据库6,在宿主机和容器之间共享数据7,在容器之间共享数据8&am…

已解决:TypeError: ‘NoneType‘ object is not callable 问题

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页: 🐅🐾猫头虎的博客🎐《面试题大全专栏》 🦕 文章图文并茂&#x1f996…

GC5958低压三相无刷直流驱动芯片,无感,正弦,低压,PWM调速可替代APX9358/茂达

GC5958提供了无传感器的三相无刷直流电机的速度控制的所有电路。正弦波驱动器的方法将是更好的低噪声。控制器功能包括启动电路、反电动势换向控制。脉宽调制) 速度控制。锁定保护和热关断电路GC5958既适合游戏机器,也适用于需要无声驱动的CPU冷却器。它以DFN3x3-10…

一篇文章教会你写一个贪吃蛇小游戏(纯C语言)

一篇文章教会你写一个贪吃蛇小游戏 1、游戏展示2、游戏功能3、Win32 API3.1 控制台程序3.2 控制台屏幕上的坐标COORD3.3 GetStdHandle函数3.4 GetConsoleCursorInfo函数3.4.1 CONSOLE_CURSOR_INFO结构体 3.5 SetConsoleCursorInfo函数3.6 SetConsoleCursorPosition函数3.7 GetA…

自动私信引流软件的运行分享,与开发需要到的技术分析

先来看实操成果,↑↑需要的同学可看我名字↖↖↖↖↖,或评论888无偿分享 一、引言 随着移动互联网的普及和人们对便捷生活的追求,引流APP已成为越来越多企业的必备工具。本文将为大家详细介绍开发引流APP需要用到的技术和流程,帮…

CSS3渐变颜色

CSS3 渐变可以让你在两个或多个指定的颜色之间显示平稳的过渡。 CSS3渐变有两种类型:线性渐变(Linear Gradients)和径向渐变(Radial Gradients)。 线性渐变(Linear Gradients): 线性…

阻塞队列+定时器+常见的锁策略

1)阻塞队列:是一个线程安全的队列,是可以保证线程安全的 1.1)如果当前队列为空,尝试出队列,进入阻塞状态,一直阻塞到队列里面的元素不为空 1.2)如果当前队列满了,尝试入队列,也会产生阻塞,一直阻…

Ionic 组件 ion-item-divider ion-item-group ion-item-sliding ion-label ion-note

1 ion-item-divider Item dividers是块元素&#xff0c;可用于分隔列表中的items 。它们类似于列表标题&#xff0c;但它们不应该只放在列表的顶部&#xff0c;而应该放在items之间。 <ion-list><ion-item-group><ion-item-divider><ion-label> Secti…

javascript 操作mysql数据库

目录 一&#xff1a;Javascript访问MYSQL 二&#xff1a;JavaScript中操作Mysql数据库实例 一&#xff1a;Javascript访问MYSQL 1、下载MYSQL的ODBC连接 2、在JS中建立ODBC连接如下&#xff1a; var con new ActiveXObject("ADODB.Connection"); con.Connection…

Linux软件包(源码包和二进制包)

Linux下的软件包众多&#xff0c;且几乎都是经 GPL 授权、免费开源&#xff08;无偿公开源代码&#xff09;的。这意味着如果你具备修改软件源代码的能力&#xff0c;只要你愿意&#xff0c;可以随意修改。 GPL&#xff0c;全称 General Public License&#xff0c;中文名称“通…

jbase代码生成器(成型篇)

上一篇说到通用码表可以解决百分之八十的基础维护功能&#xff0c;剩下的百分二十的需要级联维护的界面可以用代码生成器生成代码&#xff0c;基于生成的代码拷贝再组装界面&#xff0c;来解决这百分之二十的工作量里的百分之八十工作量。 首先实现代码生成器 Class Jbase.Ma…

C语言实现给出一位数不大于7位的整型数字,取整数从右端开始的4~7位数字

完整代码&#xff1a; // 给出一位数不大于7位的整型数字&#xff0c;取整数从右端开始的4&#xff5e;7位数字 //就是一个数为abcdefg&#xff0c;取它从右端开始的4&#xff5e;7位数字&#xff0c;就为dcba //如果位数不足7位时&#xff0c;会在数字高位补0 //例如一个数为…

leetcode 62

leetcode 62 题目 解题思路 class Solution { public:int uniquePaths(int m, int n) {vector<vector<int>> f(m, vector<int>(n));for(int i0; i<m; i){f[i][0] 1;}for(int j0; j<n; j){f[0][j] 1;}for(int i1; i<m; i){for(int j1; j<n; j){…

如何记录血压的波动情况

import pandas as pd from plotnine import * import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [Microsoft YaHei] 记录时间(time)、收缩压(SBP)、舒张压(DBP)&#xff1a; df pd.DataFrame({ time: [2023-11-01 08:30, 2023-11-02 21:00, 2023-11-0…

【星海随笔】SDN neutron (一)

一、SDN的原理&#xff1a; 控制平面与数据平面分离&#xff1a;传统网络中&#xff0c;网络设备同时承担控制和数据转发功能&#xff0c;而SDN将这两个功能分离&#xff0c;使得网络控制集中在一个中心控制器上。 中心控制器&#xff1a;SDN架构中的中心控制器负责网络的全局…