普通索引和唯一索引,应该怎么选择?

普通索引和唯一索引,应该怎么选择?

普通索引,不能保证字段的唯一性,所以普通索引会比唯一索引要多N次判断,比如判断下一条记录是否和目标相同。

InnoDB的数据其实是按页来取的,也就是说要拿到某一个数据,其实会把这一整页的数据都从磁盘加载到内存中,一页默认是16KB。

Change Buffer

如果查找普通索引中某个字段刚好在页尾,那是不是就还得继续往后判断,那就还得再加载一次数据页,而磁盘的IO操作是MySQL中成本最大的一个操作了,这样的代价会变得很大,因此,MySQL引入了Change Buffer这一概念,Change Buffer是共用Buffer Pool的空间的,它的最大空间不能超过Buffer Pool。

  • 若数据页在内存中,直接更新Buffer Pool中的数据,标记为脏页
  • 若数据不在内存中,会把更新操作先临时写入Buffer Pool中,如果马上有人访问这个数据,就会从磁盘加载这一页的数据,做完更新操作后,再把数据返回,如果暂时没有人访问,MySQL会有一个线程定时去刷盘。

而唯一索引则一定会把数据页加载到内存当中,然后更新Buffer Pool中的数据

因此,对于写多读少的场景,普通索引的效率会更高一些。

Change Buffer & Redo Log

Change Buffer 和 Redo Log 是数据库系统(尤其是 MySQL 中)用于提高性能和保证数据一致性的两种机制,它们的主要区别在于功能和应用场景:

  1. Change Buffer(更改缓冲区)

    • 作用:用于缓冲索引页的变化,特别是非聚簇索引的变化。在写入数据时,不是立即将这些数据写入磁盘上的索引页,而是暂时保存在 Change Buffer 中,等到需要读取相关索引页或者系统空闲时再将其应用到磁盘上。
    • 目的:减少频繁的磁盘 I/O 操作,尤其是在索引较多的情况下可以显著提升性能。
    • 适用场景:主要针对二级索引的写入操作。
  2. Redo Log(重做日志)

    • 作用:记录事务的变化(即使事务还没有提交),以便在数据库崩溃后可以通过重做日志恢复数据到一致状态。它记录的是对数据页的物理更改。
    • 目的:确保数据库的持久性和数据一致性,在系统崩溃时能够通过重做日志进行恢复。
    • 适用场景:Redo Log 适用于所有对数据的更改,不论是数据页还是索引页的修改。

总结:Change Buffer 主要是为了优化磁盘 I/O 而设计的,缓冲的是索引页的变化;而 Redo Log 主要是为了数据的持久性,记录的是对数据页的更改,确保系统崩溃时能够恢复。

mysql> insert into t(id,k) values(id1,k1),(id2,k2);

这里,我们假设当前 k 索引树的状态,查找到位置后,k1 所在的数据页在内存 (InnoDB buffer pool) 中,k2 所在的数据页不在内存中。

  1. Page 1 在内存中,直接更新内存;
  2. Page 2 没有在内存中,就在内存的 change buffer 区域,记录下“我要往 Page 2 插入一行”这个信息将上述两个动作记入 redo log 中(图中 3 和 4)。
  3. 做完上面这些,事务就可以完成了。所以,你会看到,执行这条更新语句的成本很低,就是写了两处内存,然后写了一处磁盘(两次操作合在一起写了一次磁盘),而且还是顺序写的。同时,图中的两个虚线箭头,是后台操作,不影响更新的响应时间。

比如,我们现在要执行 select * from t where k in (k1, k2)。

Page 1 的数据已经写入了 InnoDB 的缓冲池(buffer pool),因此可以直接从内存中读取并返回。而 Page 2 的数据还没有写入缓冲池,它的修改只记录在变更缓冲区(change buffer)中。因此,当需要读取 Page 2 时,必须先从磁盘中加载该数据页到缓冲池,然后再应用变更缓冲区中的修改,才能得到最终的正确数据版本。

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

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

相关文章

AndroidStudio配置MQTT连接云平台EMQX

引言 本篇博客主要介绍mqtt和emqx配置连接实现数据收发,我会从基础的本机连接到手机和本机连接再到手机实现mqtt连接云平台,大家可以根据需要自行选择观看(后面两个教程都建立在mqtt和emqx下载完成的基础上,若没有下载完成&#x…

黎巴嫩爆炸事件分析:硬件国产自主可控的意义

黎巴嫩近期发生的寻呼机爆炸事件,不仅对当地社会造成了冲击,也在全球范围内引发了对通信设备安全性的深刻反思。这一事件凸显了在全球化背景下,电子产品安全性的重要性,以及自主可控技术在保障国家安全和公共安全中的关键作用。 …

DataWhale10月动手实践——Bot应用开发task02学习笔记

一、Prompt工程 之前有接触过一些Prompt工程的内容,也做过一些简单的应用,比如使用langchain和Openai库自己搭建了一个助手项目,但是还从未关注过在智能体方面的Prompt。在这篇博客中,我会将我之前掌握的和在本次任务学习中掌握的…

【C++】在Windows中使用Boost库——实现TCP、UDP通信

目录 一、编译Boost库 二、TCP服务端 三、TCP客户端 四、UDP连接 一、编译Boost库 1. 先去官网下载Boost库源码 2. 点击下载最新的版本 下载Windows环境的压缩包,然后解压 3. 在解压后的目录路径下找到“bootstrap.bat” 打开控制台,在“bootstrap.…

ROS2 常用工具之Launch -- 启动管理工具

基于上一篇的action代码上继续,链接如上: ROS2 通信三大件之动作 -- Action-CSDN博客 参考链接:ROS2——教你写新版Launch文件 | 范子琦的博客 1、创建文件 src/action_moudle/launch/action_launch.launch.py 路径下创建文件action_lau…

腾讯六宫格本地识别,本地模型识别,腾讯六图识别

基于K哥爬虫昨天发的文章,特此训练了一版腾讯模型,效果不错,特此感谢K哥的指导,效果如下图: 有需求,有疑问的欢迎评论区点出

尚硅谷大数据Flink1.17实战教程-笔记04【Flink DataStream API】

尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】视频地址:尚硅谷大数据Flink1.17实战教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据Flink1.17实战教程-笔记01【Flink 概述、Flink 快速上手】尚硅谷大数据Flink1.17实战教程-笔记02【Flink 部署】尚硅…

【Spring篇】初识之Spring的入门程序及控制反转与依赖注入

🧸安清h:个人主页 🎥个人专栏:【计算机网络】,【Mybatis篇】 🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。 文章目录 🎯初始Spring …

【K8S系列】Kubernetes pod节点NotReady问题及解决方案详解【已解决】

Kubernetes 集群中的每个节点都是运行容器化应用的基础。当节点状态显示为 NotReady 时,意味着该节点无法正常工作,这可能会导致 Pod 无法调度,从而影响整个应用的可用性。本文将深入分析节点不健康的各种原因、详细的排查步骤以及有效的解决…

查看SQL执行计划 explain

查看SQL执行计划 explain explain使用方式 alter session set current_schematest; explain plan for sql语句; --并不会实际执行,因此生成的执行计划也是预估的 select * from table(dbms_xplan.display); explain使用场景 1.内存中没有谓词信息了&#xff0…

MySQL从入门到跑路

SQL语言 SQL(Structured Query Language,结构化查询语言)是用于管理和操作关系数据库的一种标准编程语言。 SQL分类: DDL(Data Definition Language):数据定义语言,用于操作数据库、表、字段&#xff0c…

前端文件流导出

1、前端代码 ​ /** 导出 */ const handleExport async () > {let config {responseType: blob,headers: {Content-Type: application/json,},};const res await getTargetExport(config);const blob new Blob([res]);const fileName PK目标跟进导出列表.xls;const li…

SpringBoot整合Freemarker(一)

Freemarker和jsp一样是一个视图的引擎模板,其实所有的模板引擎的工作原理都是类似的,如下图: 接下来就具体讲解一下Freemarker的用法,参考手册:模板 数据模型 输出 - FreeMarker 中文官方参考手册 SpringBoot默认就…

【浏览器】如何正确使用Microsoft Edge

1、清理主页广告 如今的Microsoft Edge 浏览器 主页太乱了,各种广告推送,点右上角⚙️设置,把快速链接、网站导航、信息提要、背景等全部关闭。这样你就能得到一个超级清爽的主页。 网站导航       关闭 …

HarmonyOS NEXT和认证(在校生的大福利)

今天重点关注了一下HarmonyOS NEXT,也就是我们所说的纯血鸿蒙! 根据官方的说法: 欢迎开发者进入HarmonyOS NEXT。暌违一年,HarmonyOS NEXT终于在万千开发者的期待下从幕后走向台前。 HarmonyOS NEXT采用全新升级的系统架构&#…

【Python】NumPy(一):数据类型、创建数组及基本操作

目录 ​NumPy初识 1.什么是NumPy? NumPy的应用 NumPy数据类型 Python基本数据类型 NumPy数据类型 NumPy数组 创建数组 1.使用numpy.array() 2.使用arange()方法创建 3.使用linspace()创建等差数列 4使用zeros()创建数组 5.使用ones()创建数组 6.利用…

Linux基本使用和程序部署

文章目录 一. Linux背景Linux发行版 二. Linux环境搭建Linux常见命令lspwdcdtouchcatmkdirrmcpmvtailvimgreppsnetstat管道 三. 搭建java部署环境安装jdk安装mysql部署Web项目到Linux 一. Linux背景 1969−1970年,⻉尔实验室的DennisRitchie和KenTompson开发了Unix操作系统. 他…

在Linux操作系统上安装NVM教程——CentOS 7/VMware 17版

目录 一、测试网络是否能上网 二、下载阿里云镜像 三、解决执行yum命令出现报错(没有就跳过) 四、下载NVM安装包 五、解压NVM安装包 六、安装Node 七、连接新的动态库 八、升级GLIBC版本 九、安装GCC 十、查看当前服务器CentOS版本 一、测试网…

[AWS云]kafka调用和创建

背景:因为因为公司的项目需要使用AWS的kafka,但是在创建和使用过程中都遇到了一些报错和麻烦,毕竟老外的东西,和阿里云、华为使用起来还是不一样。 一、创建(创建的配置过程就略了,就是配置一下可用区、型号&#xff0…

闯关leetcode——110. Balanced Binary Tree

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/balanced-binary-tree/description/ 内容 Given a binary tree, determine if it is height-balanced. A height-balanced binary tree is a binary tree in which the depth of the two subtrees…