在 MySQL 中,添加索引后,插入、更新和删除操作的性能通常会变慢的原因

在 MySQL 中,添加索引后,插入、更新和删除操作的性能通常会变慢。这是因为索引的存在增加了这些操作的复杂性和开销。

1. 索引维护成本

索引是一种数据结构,用于加速数据的查找。常见的索引类型包括 B-Tree 索引、哈希索引等。当插入、更新或删除数据时,数据库需要维护这些索引,以确保索引结构与表数据保持一致。

1.1 插入操作

  • B-Tree 索引:插入新记录时,数据库需要在 B-Tree 中找到合适的位置插入新记录,并更新 B-Tree 的节点。这涉及到磁盘 I/O 操作,因为 B-Tree 的节点可能需要分裂和合并,以保持平衡。

  • 哈希索引:对于哈希索引,插入操作需要计算哈希值并将其插入到哈希表中。虽然哈希索引的查找速度非常快,但插入操作仍然需要维护哈希表的结构。

1.2 更新操作

  • B-Tree 索引:更新操作可能需要更新多个索引。例如,如果更新了某个索引列的值,数据库需要删除旧值并插入新值,这涉及到 B-Tree 的节点更新和可能的分裂与合并。

  • 哈希索引:对于哈希索引,更新操作需要删除旧的哈希值并插入新的哈希值,这同样会增加开销。

1.3 删除操作

  • B-Tree 索引:删除操作需要从 B-Tree 中删除相应的索引项,并可能触发节点的合并操作。

  • 哈希索引:对于哈希索引,删除操作需要从哈希表中删除相应的哈希值。

2. 锁机制

在插入、更新和删除操作期间,数据库可能需要对索引结构进行锁定,以防止并发操作导致数据不一致。这会增加操作的延迟,尤其是在高并发环境下。

3. 日志记录

为了保证数据的一致性和持久性,MySQL 使用事务日志(如 InnoDB 的 Redo Log)来记录所有修改操作。插入、更新和删除操作不仅需要写入数据页,还需要写入日志文件。日志文件的写入操作通常是顺序写,但仍然会增加操作的开销。

4. 缓冲池管理

InnoDB 使用缓冲池(Buffer Pool)来缓存数据页和索引页。插入、更新和删除操作需要将新数据页和索引页加载到缓冲池中,并可能触发缓冲池的淘汰策略(如 LRU 算法),这会增加操作的开销。

5. 索引碎片

随着数据的插入、更新和删除,索引可能会产生碎片。碎片会增加索引的查找和插入操作的开销,因为数据库需要处理更多的磁盘 I/O 操作。

示例

假设有一个表 example_table,包含一个主键索引和一个唯一索引:

CREATE TABLE example_table (id INT AUTO_INCREMENT PRIMARY KEY,unique_column VARCHAR(255),data_column VARCHAR(255),UNIQUE (unique_column)
);

插入操作
插入一条记录时,数据库需要执行以下操作:

  • 插入数据:将数据插入到表的数据页中。

  • 更新主键索引:将主键值插入到主键索引的 B-Tree 中。

  • 更新唯一索引:将 unique_column 的值插入到唯一索引的 B-Tree 中。

  • 写入日志:将插入操作记录到事务日志中。

  • 缓冲池管理:将新数据页和索引页加载到缓冲池中。

更新操作
更新一条记录时,数据库需要执行以下操作:

  • 更新数据:将数据更新到表的数据页中。

  • 更新主键索引(如果主键列被更新):删除旧的主键值并插入新的主键值。

  • 更新唯一索引(如果 unique_column 被更新):删除旧的 unique_column 值并插入新的 unique_column 值。

  • 写入日志:将更新操作记录到事务日志中。

  • 缓冲池管理:更新缓冲池中的数据页和索引页。

删除操作
删除一条记录时,数据库需要执行以下操作:

  • 删除数据:将数据从表的数据页中删除。

  • 删除主键索引:从主键索引的 B-Tree 中删除主键值。

  • 删除唯一索引:从唯一索引的 B-Tree 中删除 unique_column 值。

  • 写入日志:将删除操作记录到事务日志中。

  • 缓冲池管理:更新缓冲池中的数据页和索引页。

总结

添加索引后,插入、更新和删除操作变慢的主要原因是索引维护成本、锁机制、日志记录、缓冲池管理以及索引碎片等因素。虽然索引可以提高查询性能,但在高写入负载的情况下,需要权衡索引带来的性能影响。

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

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

相关文章

【学习笔记】网络设备(华为交换机)基础知识 9 —— 堆叠配置

提示:学习华为交换机堆叠配置,含堆叠的概念、功能、角色、ID和优先级;堆叠的建立过程以及注意事项;包含堆叠的配置命令,以及堆叠的配置案例 一、前期准备 1.已经可以正常访问交换机的命令行接口 Console口本地访问教…

解码专业术语——应用系统开发项目中的专业词汇解读

文章目录 引言站点设置管理具体要求包括: Footer管理基于URL的权限控制利用数据连接池优化数据库操作什么是数据连接池?优化的优势 利用反射改造后端代码,AJAX反射的作用及其在后端代码中的应用AJAX 实现前后端无刷新交互 引言 创新实践项目二…

『完整代码』按钮开关UI界面

创建按钮Button 作为开关坐骑UI界面的按钮 创建Image 作为坐骑UI界面 在父类脚本添加其中函数即可 绑定脚本在父类窗口对象 在按钮上响应事件 隐藏UI界面 运行项目 - 实现点击按钮开关UI界面 再次点击按钮 - 关闭UI界面 end

想让前后端交互更轻松?alovajs了解一下?

作为一个前端开发者,我最近发现了一个超赞的请求库 alovajs,它真的让我眼前一亮!说实话,我感觉自己找到了前端开发的新大陆。大家知道,在前端开发中,处理 Client-Server 交互一直是个老大难的问题&#xff…

【C++训练营】现代C++编程(隐藏)

一、面向对象的特性 1.1 编码规范 1.1.1 效率 时间/空间:计算相关逻辑的时间复杂度和空间复杂度内存:考虑内存占用和cache命中率堆/栈:从生存周期、内存管理复杂性、对象大小等角度来考虑堆栈应用存储:考虑存储护具方式和读取方…

使用docker-compose搭建redis7集群-3主3从

下面是一个用于搭建 Redis 集群的 docker-compose.yml 示例文件,它会启动 6 个 Redis 节点(3 主节点 3 从节点)来构成一个最小的 Redis 集群。 同一个容器内网通讯没问题,但是你要是需要暴露到外网你需要用第二个yml 内网的 v…

信雅纳Chimera 100G网络损伤仪助力Parallel Wireless开展5G RAN无线前传网络的损伤模拟

背景介绍 Parallel Wireless 为移动运营商提供唯一全覆盖的(5G/4G/3G/2G)软件支持的本地 OpenRAN (ORAN) 解决方案。该公司与全球 50 多家领先运营商合作,并被 Telefonica 和 Vodafone 评为表现最佳的供应商。Parallel Wireless 在多技术、开放式虚拟化…

从头学PHP之运算符

关于运算符的图片均来自网络,主要是自己写太麻烦了,程序是个简化自己工作量的方式,能复制粘贴就不要手写了(建议初期还是多写写,加深下记忆)在这里我就偷个懒,图片涉及到侵权及时,请…

实现酒店搜索框自动补全

前言 现在,hotel索引库还没有设置拼音分词器,需要修改索引库中的配置。但是知道索引库是无法修改的,只能删除然后重新创建。 另外,需要添加一个字段,用来做自动补全,将brand、suggestion、city等都放进去…

小程序无法获取头像昵称以及手机号码

用户在使用小程序的时候,登录弹出获取昵称头像或者个人中心点击默认头像弹窗获取头像昵称的时候,点击弹窗中的头像昵称均无反应, 这个是因为你的小程序隐私政策没有更新,或者老版本没有弹窗让用户同意导致的 解决办法&#xff1…

SpringBoot:举例说明如何使用@ControllerAdvice处理全局异常

使用RestController开发web接口时,需要处理Controller层未捕获的异常,提高系统的健壮性。 一般常用的方式是采用ControllerAdvice和ExceptionHandler,举例如下: ControllerAdvice public class ControllerAdvice {ExceptionHand…

UML外卖系统报告(包含具体需求分析)

1、系统背景 随着互联网技术的快速发展,外卖订餐服务逐渐成为人们生活中的一部分。传统的电话订餐方式面临诸多不便和限制,而基于互联网的外卖订餐系统则提供了更加便捷、快速和高效的订餐服务。这种系统通过将餐厅、顾客和配送人员连接起来&#xff0c…

截屏工具,

1,pc端的shiftwins,或者是prtsc按钮,但是有时候容易失效 2,第三方工具:Snipaste Snipaste - 截图 贴图 用户手册见Snipaste **常用F2或者是F3快捷键,切换桌面,而不是下端一个一个点击窗口页面…

论文阅读与写作入门

文章目录 1.阅读第一篇论文(1)论文结构(2)目标 2.使用GPT辅助论文的阅读与写作3.专有名词(1)架构(2)网络(3)机器学习 4.文献翻译软件5.从哪里下载文献?6.如何判断(你自己的)研究工作的价值or贡献【论文精读李沐】7.经典论文(1)AlexNet 2012(2)FCN 全卷积 2014(3)Res…

【Go语言】语法基础之变量、数据类型详解

🐇明明跟你说过:个人主页 🏅个人专栏:《Go语言探索之旅》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、Go语言简介 2、Go语言特点 二、变量 1、变量的声明与初始化 2、变量…

【C++篇】C++类与对象深度解析(五):友元机制、内部类与匿名对象的讲解

文章目录 前言 💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力! 👍 点赞、收藏与分享:觉得这篇文章对你有帮助&#xff01…

时序数据库 TDengine 支持集成开源的物联网平台 ThingsBoard

Thingsboard 中“设备配置”和“设备”的关系是一对多的关系,通过设备配置为每个设备设置不同的配置,每个设备都会有一个与其关联的设备配置文件。等等,这不就是TDengine 中超级表的概念: 超级表是一种特殊的表结构,用…

【功能安全】汽车功能安全个人认证证书

目录 1、证书 2、课程信息 📖 推荐阅读 1、证书 汽车功能安全工程师去拿类似莱茵、SGS、南德颁发的证书,如下: 2、课程信息 一般上什么课程了,课程信息大概如下: 汽车功能安全工程师认证课 (3天&#…

数据库作业2

建立并使用mydb8_worker,并在其中建表: (1)显示所有职工的基本信息 (2)去重查询 (3)所有职工人数 (4)最高最低工资 (5)平均工资和总工…

2024“龙信杯“电子数据取证竞赛-手机取证题目Writeup

文章关键词:电子数据取证、电子物证、手机取证、服务器取证、介质取证 案情介绍 近期,某公安机关正式受理了一起受害者报案案件。受害者陈述称,其通过微信平台结识了一名自称为相亲中介服务的客服人员。该客服人员诱骗受害者参与所谓的“相亲…