MYSQL 8 中间字段有NULL 值,还是无法走索引,所以我高估了MYSQL 的查询智商

news2024/7/4 5:06:12

36ce18e131743dc9476a060b32780ed5.png

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共800人左右 1 + 2 + 3)新人会进入3群,回复有特殊需求的会同时进2群和3群。

基于半瓶子咣当的状态,PG, MYSQL , POLARDB , MONGODB ,REDIS 还是都能舞刀弄枪几下的,但是这个弄这弄着,这记忆力就会不好,因为我一直对于MYSQL 8 的优化器的进步,表达了一个满意的记忆,虽然你比不了,oracle, sql server ,pg ,但是MYSQL 也差不太多了,实际上教育了我,版本MYSQL 8.013(生产) 试验 8.030 实际上这二者在这个问题上没有差别。当然也再次印证了, 开源数据库一定在某些方面是给你一个  disabled 的 状态,否则怎么就商业数据库卖钱呢,不同意的参见,今天一起发的 POSTGRESQL EDB 公司的文章, PG ,MYSQL 同时都能印证,不花钱的产品,你要求别太高。

废话太多,在生产上的一个表字段中包含了连续了  A  + B + C  A 为字符,B 为字符,C为日期,索引中也是这样建立的,A B C ,但是在查询中出现了 A + C (C为范围查询),虽然实际上走了我们建立的索引,但是实际上,和没走也差不多。下面用一个实例来反馈

测试数据100万

3d87cb00053ebd68525e62faaa1f16a6.png

select * from test_innodb where user_id = '00OSL5Whq664QQzaYbOp' and create_time >= '2023-04-14 10:00:00' and create_time < '2023-04-19 10:00:00';

语句很简单,另外数据中在生产系统中,user_id 的位置并不是唯一值,而测试系统中是唯一值,group_id 不是唯一值,并且里面有NULL ,时间就是我们的时间,没有空值。

索引我们先建立三个字段的,然后执行了查询语句。从图中看,我们可以看到走了三个字段的联合索引,但是基本上在选择字段部分仅仅是使用 user_id 作为实际索引使用的部分。

f3c79445ba0024e4d74c5addb301b09a.png

在我们创建了仅仅有 user_id 和 create_time 的索引,我们再次运行语句,可以看到整体的执行的中的执行计划,是走了索引的全部

3a3bc7529d9d811147ef3b1e97e2a435.png

我的问题就来了,这个为什么同样的数据库同样的语句,同样的MYSQL,执行计划中,仅仅是一个索引,中间多个一个字段,就忽略了后面的日期范围部分,WHY ,我的记忆是MYSQL 是可以跳过索引中间有字段但是查询里面没有需求的字段。

原因是为什么在 MySQL 中,当使用复合索引(包含多个字段的索引)时,如果中间字段的值为 NULL,那么将仅会走前缀。也就是说,复合索引只有在所有前面字段的值都非 NULL 时,才能被用来检索。

例如,假设我们有一个包含三个字段(a, b, c)的复合索引:

CREATE INDEX idx_example ON table_name (a, b, c);

以下查询可以使用复合索引 idx_example

SELECT * FROM table_name WHERE a = 1 AND b = 2;

但是,如果字段 b 的值为 NULL,那么复合索引将只能走前缀,即只会用到字段 a

SELECT * FROM table_name WHERE a = 1 AND b IS NULL;

此时,索引将不再涉及字段 c,因为字段 b 的值为 NULL,导致索引只能走前缀。

那么别的数据库是否也有这个问题,我们来看看 MYSQL 的死对头 POSTGRESQL 

在 PostgreSQL 中,当使用复合索引(包含多个字段的索引)时,即使中间字段的值为 NULL,该复合索引仍可以用于查询。这是因为 PostgreSQL 对 NULL 值进行了特殊处理,将其包含在索引内。这种行为与 MySQL 不同。

例如,假设我们有一个包含三个字段(a, b, c)的复合索引:

CREATE INDEX idx_example ON table_name (a, b, c);

以下查询可以使用复合索引 idx_example:

SELECT * FROM table_name WHERE a = 1 AND b = 2;

同时,当字段 b 的值为 NULL 时,PostgreSQL 也能够使用该复合索引:

SELECT * FROM table_name WHERE a = 1 AND b IS NULL;

在这个例子中,即使 b 字段的值为 NULL,索引依然可以被用来检索。

那么到此为止,同为免费数据库的POSTGRESQL 是可以在这样的情况来使用索引的,那么我们就会引发一个MYSQL 性能差另一个问题

在查询中,MYSQL 可能会由于应付上面的查询,需要建立更多的索引来满足查询的性能要求,而其他的数据库则不需要,一个索引基本上可以搞定。

最终导致MYSQL 的查询,插入,删除等性能都相对于其他的数据库低下。好吧,不能说下去,MYSQL的FUNS 已经举着刀杀来了。 

8964e0c2c6e5e133430b6ec0ca9a278b.png

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

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

相关文章

并查集(算法)

目录 一、并查集的概念二、并查集的使用合并集合连通块中点的数量食物链带权并查集扩展域并查集 一、并查集的概念 最裸并查集&#xff1a; 将两个集合合并。 询问两个元素是否在一个集合当中 &#xff0c;近乎 O ( 1 ) O(1) O(1) 时间内支持两个操作 基本原理&#xff1a…

chatgpt赋能python:Python文件大小:如何优化和管理您的文件大小

Python 文件大小&#xff1a;如何优化和管理您的文件大小 Python 是世界上最流行的编程语言之一&#xff0c;被广泛用于各种不同的应用程序。但是&#xff0c;随着项目变得越来越复杂&#xff0c;并且在需要处理大量数据的情况下&#xff0c;文件大小经常成为一个问题。因此&a…

数据包伪造、替换、劫持,https劫持之探索和测试

&#xff08;一&#xff09;数据包替换攻击 该攻击过程如下&#xff1a;伪造服务器响应客户端的数据包。监听客户端的数据包&#xff0c;用预先伪造的数据包&#xff0c;伪装成服务器返回的数据发送给客户端。 因为攻击者跟目标在同一个局域网&#xff0c;所以攻击者发送的数…

算法27:最长公共子序列——样本模型(4)

目录 简介 题目&#xff1a; 思路&#xff1a; 递归版本&#xff1a; 根据递归 分析推导 动态规划版本&#xff1a; 简介 前面刷了几道题目&#xff0c;都是从暴力递归到递归动态规划的版本&#xff0c;最后演变成纯动态规划的版本。接下来的题目&#xff0c;将会跳过 递…

chatgpt赋能python:Python找出列表中出现最多的元素

Python找出列表中出现最多的元素 介绍 在Python的编程过程中&#xff0c;经常需要处理列表&#xff0c;而处理列表时最常见的问题之一就是如何找出列表中出现最多的元素。在某些情况下&#xff0c;我们可能需要确定列表中重复出现最多的元素&#xff0c;并将其提取出来。Pyth…

[机器学习]线性回归

准备入门一下机器学习算法。 今天学习了线性回归&#xff0c;都是理论的东西&#xff0c;没有对于代码的实现&#xff0c;代码也会跟着进度好好搞一下。 对于线性回归的基础概念&#xff0c;我感觉很依靠概率论和线性代数两门课&#xff0c;作为刚准备完数学一考研的我&#xf…

Systrace系列12 —— CPU Info 解读

本文主要是对 Systrace 中的 CPU 信息区域(Kernel)进行简单介绍,简单介绍了如何在 Systrace 中查看 Kernel 模块输出的 CPU 相关的信息,了解 CPU 频率、调度、锁频、锁核相关的信息。 CPU 区域图例 下面是高通骁龙 845 手机 Systrace 对应的 Kernel 中的 CPU Info 区域(底下…

人工智能轨道交通行业周刊-第46期(2023.5.22-5.28)

本期关键词&#xff1a;数字孪生、AI铁路人、道岔、施封锁、图像质量评价、大模型小型化 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetro轨道…

在VIVADO下烧写ZC706板载FLASH的操作步骤

1&#xff0c;原理图分析 首先看原理图&#xff0c;我们兼容ZC706的板子有两片 FLASH&#xff0c;型号是S25FL128A,连接方式如下&#xff1a; 可以看到两片是分别接在了XC7Z045芯片的引脚上&#xff0c;是互不相干的并联方式&#xff0c;每个FLASH芯片支持X4模式&#xff0c;也…

Systrace系列11 —— Triple Buffer 解读

本文主要是对 Systrace 中的 Triple Buffer 进行简单介绍,简单介绍了如何在 Systrace 中判断卡顿情况的发生,进行初步的定位和分析,以及介绍 Triple Buffer 的引入对性能的影响。 怎么定义掉帧? Systrace 中可以看到应用的掉帧情况,我们经常看到说主线程超过 16.6 ms 就会…

第一个Vue程序

什么是MVVM MVVM是Model-View-ViewModel的缩写&#xff0c;是一种软件架构模式&#xff0c;用于将用户界面&#xff08;UI&#xff09;的开发与业务逻辑和数据分离开来。 在MVVM架构中&#xff0c;Model代表数据模型层&#xff0c;View代表用户界面层&#xff0c;ViewModel充…

基于Java+控制台实现教材管理系统

基于Java控制台实现教材管理系统 一、系统介绍二、功能展示1.教材订购2.教材出售3.教材统计4.库存管理 四、其它1.其他系统实现2.获取源码 一、系统介绍 系统主要包括了教材订购、教材出售、教材统计、库存管理几大部分&#xff1b; 其中功能主要包括&#xff1a; 一、教材订购…

English Learning - L3 作业打卡 Lesson3 Day22 2023.5.26 周五

English Learning - L3 作业打卡 Lesson3 Day22 2023.5.26 周五 引言&#x1f349;句1: He would never pour salt on a wound, or make someone feel worse about something that was already a painful experience.成分划分弱读连读爆破语调 &#x1f349;句2: However, some…

字符串最后一个单词的长度

描述 计算字符串最后一个单词的长度&#xff0c;单词以空格隔开&#xff0c;字符串长度小于5000。&#xff08;注&#xff1a;字符串末尾不以空格为结尾&#xff09; 输入描述&#xff1a; 输入一行&#xff0c;代表要计算的字符串&#xff0c;非空&#xff0c;长度小于500…

JavaScript处理移动web交互

touch对象和touchevent touch事件 touch对象 每一次发生touch事件时就会产生一个touch对象&#xff0c;类似事件处理函数中的事件对象。 <div class" "><button class"child" style"height: 400px; width: 400px">我是按钮</b…

OneNote:隐藏OneNote笔记右边的作者和更新时间

OneNote在其他电脑登录后同步笔记&#xff0c;会在笔记右边显示用户名称和更新时间&#xff0c;消除方法如下&#xff1a; 在顶部找到历史记录&#xff0c;点击隐藏作者即可&#xff1a; 隐藏后效果&#xff1a; 说明&#xff1a; 1、用于window10系统。

Mybatis源码的理解

文章目录 0.核心的包1.1 配置文件mybatis-config.xml1.2 配置文件解析将配置文件转化为输入流,将 xml转化Configuration类.解析配置对应的标签为Configuration的属性Configuration的核心类的属性 1.3 解析完成查询之后的configurationenvironment类sqlFragments类mapperRegistr…

(转载)基于量子遗传算法的函数寻优算法

8.1 理论基础 8.1.1 量子遗传算法概述 量子遗传算法(quantum genetic algorithm,QGA)是量子计算与遗传算法相结合的产物&#xff0c;是一种新发展起来的概率进化算法。遗传算法是处理复杂优化问题的一种方法&#xff0c;其基本思想是模拟生物进化的优胜劣汰规则与染色体的交…

结构型设计模式02-代理模式

✨作者&#xff1a;猫十二懿 ❤️‍&#x1f525;账号&#xff1a;CSDN 、掘金 、个人博客 、Github &#x1f389;公众号&#xff1a;猫十二懿 代理模式 1、不使用代理模式 举例说明&#xff1a;小明喜欢一个女生&#xff08;小红&#xff09;&#xff0c;因为小红不认识小明…

【数据结构】初步了解排序

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 1.排序的概念及其运用 1.1排序的概念 2.常见排序算法的实现 2.1插入排序 2.2希尔排序 问题:gap是多少合适&#xff1f; 1.排序的概念及其运用 1.1排序的概念 排序&#xff1a;所…