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

MySQL:为什么说应该优先选择普通索引,尽量避免使用唯一索引

前言

在使用MySQL的过程中,随着表数据的逐渐增多,为了更快的查询我们需要的数据,我们会在表中建立不同类型的索引。

今天我们来聊一聊,普通索引和唯一索引的使用场景,
以及为什么说推荐大家优先使用普通索引,尽量避免使用唯一索引。

对于一个普通的二级索引,目的就是为了加速查询,
所以我们可能会为表中的某个字段或者某些字段,建立一个普通的二级索引。

而对于唯一索引来说,由于其唯一键约束的特性,有时我们会更多的赋予其业务含义。
比如有一张存储身份证号的表,为了保证身份证号的唯一性,我们会在身份证号字段上建立唯一索引。

那为什么说,不推荐大家使用唯一索引呢?

接下来,我们从查询和更新两方面分析一下唯一索引和普通索引的性能差距。

查询性能

我们知道每个索引其实都是一棵二叉树,所以我简单画了一个索引图,不太好看,大家多多担待。

给大家稍微解释一下这张图,不同颜色代表不同的数据页,这里假设一个数据页里面存放两条数据。

我们知道MySQL磁盘与内存交互是通过一个叫做数据页的单位,每个数据页默认的大小是16K。

在一棵树上,只有叶子节点才会真正的存放数据,非叶子节点存放的是每个下级数据页中最小的索引字段以及指向下级数据页的指针。

对于主键索引,叶子节点存放的是一行真正的数据,而对于二级索引来说,在叶子节点存储的是索引字段以及对应的主键id。

好了,下面我们分析一下,普通二级索引和唯一索引是如何查数据的?

以一个简单的查询sql为例:select id from t where m=103;

1,MySQL从根节点出发,通过二分法判断m=103大于100小于104,所以会找到根节点中100对应的数据页100-102;

2,在100-102的数据页上,由于103大于102,所以会找到102对应的102-103的数据页;

3,在这个数据页上,找到了m=103的记录,并获取到了要查询的id字段。

对于普通的二级索引来说,找到第一条m=103的记录之后,会继续向后查找,在104-105这个数据页中判断是否还有符合m=103条件的记录,如果没有则结束查询。

而对于唯一索引来说,由于其唯一性约束,所以在查找到第一条记录之后,就结束了查找。

可以看到,二者的差别就在于是否继续查到下一条。

那这两者有多大的性能差距呢?答案是几乎没有。

我们知道,MySQL的数据是以页为单位存放的,以一个int类型的二级索引为例,一个int占4个字节,加上MySQL的头信息6个字节,相当于10个字节。

那么一个16k的页上能存放多少记录呢?

16*1024/10 = 1638。也就是说,一个数据页就可能放下1600多条记录。那么我们在查询数据时,会把整个数据页都加载进内存,此时对于普通二级索引判断下一个记录的操作所需的消耗是非常非常小的。

可以说,从查询方面来看,普通二级索引和唯一索引的性能基本是相当的。

更新性能

唯一索引和普通二级索引的性能差距主要体现在更新操作上。

对于MySQL来说,更新一条语句的逻辑是首先读到要更新的记录,如果这个记录没有在内存里,就先加载到内存。然后执行更新的语句,之后再把变更的数据刷新到磁盘中。

但是,对于MySQL来说,把数据从磁盘读到内存涉及到随机IO,是成本非常高的一种操作。

如果每次更新数据都要这么来一次的话,高性能这个指标恐怕很难保证。

所以,设计MySQL的大神们引入了一个叫做change buffer的东西。

change buffer是一种可以持久化的缓存数据,当我们要更新数据时,如果要更新的数据不存在于内存,此时并不需要把数据从磁盘加载到内存,而是将更新操作记录在change buffer中,更新操作就算完成了。

当下次要读取这些数据时,会把读到的数据和change buffer进行合并,或者叫merge。

通过change buffer,更新操作就不需要去读磁盘了,全程都是内存操作,性能自然可以得到极大的提升。

但是!但是问题又来了!

change buffer只对普通二级索引有效,对于唯一索引是没有效果的。

为什么呢?

因为在更新一条记录时,我们需要检查索引的唯一性约束。

如何检查呢?自然首先要把数据从磁盘加载到内存里面才能进行判断。

可是如果都已经把数据加载到内存里,再去使用change buffer不就显得多此一举了。

所以,唯一索引不能,也没必要去使用change buffer来提升性能了。

由于对唯一索引的更新涉及到读磁盘这个随机IO操作,性能自然也是比不上普通二级索引了,这就是推荐大家优先使用普通二级索引的原因了。

经过对比,大家也可以看到,这两种索引在查询上性能基本是一致的,其性能差距主要体现在更新操作上。

其实即便是大家有一些特殊的业务需要,比如存放唯一的身份证号等,还是建议大家通过业务层去约束。

总的来说,普通的二级索引比唯一索引带来的收益要更大。

相关文章:

MySQL:为什么说应该优先选择普通索引,尽量避免使用唯一索引

前言 在使用MySQL的过程中,随着表数据的逐渐增多,为了更快的查询我们需要的数据,我们会在表中建立不同类型的索引。 今天我们来聊一聊,普通索引和唯一索引的使用场景, 以及为什么说推荐大家优先使用普通索引&#xf…...

Spring Cloud alibaba之Feign

JAVA项目中如何实现接口调用?HttpclientHttpclient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持Http协议的客户端编程工具包,并且它支持HTTP协议最新版本和建议。HttpClient相比传统JDK自带的URL Connection&a…...

零信任-Google谷歌零信任介绍(3)

谷歌零信任的介绍? "Zero Trust" 是一种网络安全模型,旨在通过降低网络中的信任级别来防止安全威胁。在零信任模型中,不论请求来自内部网络还是外部网络,系统都将对所有请求进行详细的验证和审核。这意味着每次请求都需…...

Numpy基础——人工智能基础

文章目录一、Numpy概述1.优势2.numpy历史3.Numpy的核心:多维数组4.numpy基础4.1 ndarray数组4.2 内存中的ndarray对象一、Numpy概述 1.优势 Numpy(Nummerical Python),补充了Python语言所欠缺的数值计算能力;Numpy是其它数据分析及机器学习库的底层库&…...

电商仓储与配送云仓是什么?

仓库是整个供给链的关键局部。它们是产品暂停和触摸的点,耗费空间和时间(工时)。空间和时间反过来也是费用。经过开发数学和计算机模型来微调仓库的规划和操作,经理能够显著降低与产品分销相关的劳动力本钱,进步仓库空间应用率,并…...

【零基础入门前端系列】—HTML介绍(一)

【零基础入门前端系列】—HTML介绍(一) 一、什么是HTML HTML是用来描述网页的一种语言HTML指的是超文本标记语言:HyperText Markup LanguageHTML不是一种编程语言,而是一种超文本标记语言,标记语言是一套标记标签(ma…...

Elasticsearch索引库和文档的相关操作

前言:最近一直在复习Elasticsearch相关的知识,公司搜索相关的技术用到了这个,用公司电脑配了环境,借鉴网上的课程进行了总结。希望能够加深自己的印象以及帮助到其他的小伙伴儿们😉😉。 如果文章有什么需要…...

使用Python,Opencv检测图像,视频中的猫

使用Python,Opencv检测图像,视频中的猫🐱 这篇博客将介绍如何使用Python,OpenCV库附带的默认Haar级联检测器来检测图像中的猫。同样的技术也可以应用于视频流。这些哈尔级联由约瑟夫豪斯(Joseph Howse)训练…...

浅谈域名和服务器集约化管理的误区

一个正常的网站通常由域名、网站程序、服务器三个部分组成,网站程序由单位开发设计,而域名和服务器则需要租用购买,那么域名和服务器之间的关系是什么?如何实现域名和服务器的有效管理呢? 服务器和域名的关系 服务器…...

迪赛智慧数——柱状图(正负条形图):20212022人才求职最关注的因素

效果图从近两年职场跳槽方向看,相比此前人们对高薪大厂趋之若鹜,如今职场人更关注业务前景。根据相关数据显示,职场人求职最关注的因素中,“薪资福利”权重下降,“个人发展”权重上升,“业务前景”首次进入…...

网络安全-黑帽白帽红客与网络安全法

网络安全-黑帽白帽红客与网络安全法 本章内容较少,因为刚开端。 黑客来源于hacker 指的是信息安全里面,能够自由出入对方系统,指的是擅长IT技术的电脑高手 黑帽黑客-坏蛋,研究木马的,找漏洞的,攻击网络或者…...

Xpath元素定位之同级节点,父节点,子节点

XPath学习:轴(8)——following-siblingXPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 同时被构建于 XPath 表达之上。推荐一个挺不错的网站:htt…...

华为OD机试 - 挑选字符串(Python)| 真题+思路+代码

挑选字符串 题目 给定 a-z,26 个英文字母小写字符串组成的字符串 A 和 B, 其中 A 可能存在重复字母,B 不会存在重复字母, 现从字符串 A 中按规则挑选一些字母可以组成字符串 B 挑选规则如下: 同一个位置的字母只能挑选一次, 被挑选字母的相对先后顺序不能被改变, 求最…...

python笔记-- “__del__”析构方法

-#### 1、基本概念(构造函数与析构函数) 特殊函数:由系统自动执行,在程序中不可显式地调用他们 构造函数: 建立对象时对对象的数据成员进行初始化(对象初始化) 析构函数: 对象生命期…...

支付系统核心架构设计思路(万能通用)

文章目录1. 支付系统总览核心系统交互业务图谱2. 核心系统解析交易核心交易核心基础交易类型抽象多表聚合 & 订单关联支付核心支付核心总览支付行为编排异常处理渠道网关资金核算3. 服务治理平台统一上下文数据一致性治理CAS校验幂等 & 异常补偿对账准实时对账DB拆分异…...

python实现mongdb的双活

如何用python实现mongdb的双活,两个数据库实时同步? 可以使用Pymongo库,它可以提供同步的API来实现MongoDB的双活,两个数据库实时同步。还可以使用MongoDB的复制集功能来进行实时同步。 Pymongo库提供什么同步的API来实现MongoD…...

LeetCode-110. 平衡二叉树

目录题目分析递归法题外话题目来源 110. 平衡二叉树 题目分析 平很二叉树:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 二叉树节点的深度和二叉树节点的高度 递归法 递归三步曲 1.明确递归函数的参数和返回值 参数:当前传入节点。 返回值…...

Python蓝桥杯训练:基本数据结构 [链表]

Python蓝桥杯训练:基本数据结构 [链表] 文章目录Python蓝桥杯训练:基本数据结构 [链表]一、链表理论基础知识二、有关链表的一些常见操作三、力扣上面一些有关链表的题目练习1、[移除链表元素](https://leetcode.cn/problems/remove-linked-list-element…...

华为OD机试 - 找字符(Python)| 真题+思路+代码

找字符 题目 给定两个字符串, 从字符串2中找出字符串1中的所有字符, 去重并按照 ASCII 码值从小到大排列。 输入 字符范围满足 ASCII 编码要求, 输入字符串1长度不超过1024, 字符串2长度不超过100。 输出描述 按照 ASCII 由小到大排序 示例一 输入 bach bbaaccddf…...

使用继承与派生的6大要点

概述 面向对象编程技术非常看重软件的可重用性,在C中,可重用性是通过继承机制来实现的。继承机制允许程序员在保持原有类的数据和功能的基础上进行扩展,增加新的数据和功能,从而构成一个新的类,也称为派生类。原有类&a…...

使用Taotoken的Python SDK快速接入大模型API教程

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用Taotoken的Python SDK快速接入大模型API教程 对于希望快速将大模型能力集成到Python应用中的开发者而言,直接对接多…...

多智能体系统的最大难题:不是推理,而是协同

网罗开发(小红书、快手、视频号同名)大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方…...

产品经理把PRD写成“天书”,我用AI半小时重写了一遍,他当场愣住

前言 产品经理和开发之间的矛盾,根源往往不在需求本身,而在于需求表达方式。一个合格的需求文档应该包含:功能描述、业务规则、边界条件、异常处理、验收标准。但现实中,很多PRD长这样:“用户点击支付后,系…...

Diablo Edit2:5分钟掌握暗黑破坏神2终极角色编辑器

Diablo Edit2:5分钟掌握暗黑破坏神2终极角色编辑器 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 你是否厌倦了在暗黑破坏神2中反复刷装备的无尽循环?是否因为技能点分配失…...

AM62x处理器SPI总线实战:从原理到Linux驱动配置与调试

1. 从四根线到高效数据流:深入拆解AM62x处理器的SPI总线实战在嵌入式开发里,和各类传感器、存储芯片、显示屏打交道是家常便饭。当你需要一种简单、高效、引脚又少的通信方式时,SPI总线几乎总是首选方案。它就像一条精心设计的高速公路&#…...

Godot 4.3中工业级3D反向运动学(IK)落地实践指南

1. 这不是“加个插件就完事”的IK方案,而是真正能进生产管线的3D反向运动学落地实践在Godot 4.3正式版发布后第三周,我接手了一个角色动画需求:让一个机械臂模型在VR场景中实时响应手柄位置,末端执行器(夹爪&#xff0…...

解决 Claude Code 频繁封号与 Token 不足的替代方案

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 解决 Claude Code 频繁封号与 Token 不足的替代方案 对于依赖 Claude Code 进行代码生成与对话的开发者而言,服务中断和…...

顶伯文字转语音工具:批量转换,万字长文轻松搞定

🎯 顶伯文字转语音工具:批量转换 微软TTS,万字长文轻松搞定将目标文本整理为纯文本格式(如 TXT),并检查有无特殊符号或乱码。顶伯工具支持直接粘贴文本或上传文件。进入语音选择界面,你可以从微…...

HarmonyOS APP<<古今职鉴定>>开源教程第20篇:农历日期与节日计算

本篇学习农历算法,实现年俗内容的日期驱动图:农历日期与节日计算 的关键流程与实现要点。 学习目标 完成本篇后,你将能够: ✅ 理解农历算法原理✅ 实现公历转农历✅ 计算传统节日✅ 实现年俗日期匹配 预计学习时间 约 90 分钟…...

Agent_Skills_万千应用_第01篇_PDF 处理 Skill:让 Agent 真正会读、会拆、会抽取 PDF

Agent Skills 万千应用 第01篇 PDF 处理 Skill:让 Agent 真正会读、会拆、会抽取 PDF 01|场景痛点开场:PDF 是办公室里最像“黑盒”的文件 你一定遇到过这种场景:老板丢来一份 80 页行业报告,让你 10 分钟内说清楚“…...