普通索引和唯一索引如何选择

  • 查询过程

    • 普通索引和唯一索引的性能差别不大。

      • 因为引擎是按页读写的,按条件查询的话它所在的数据页就都在内存里了,即使普通索引还有其他的操作,但是我们计算平均性能差异时,仍可以认为这个操作成本对于现在的CPU来说可以忽略不计。

    • 尽量选择普通索引

  • 更新过程

    • 当需要更新一个数据页时,如果数据页内存就直接更新。

    • 如果这个数据页还没有在内存中的话,在不影响数据一致性的前提下,InooDB会将这些更新操作缓存在change buffer中,这样就不需要从磁盘中读入这个数据页了。在下次查询需要访问这个数据页的时候,将数据页读入内存,然后执行change buffer中与这个页有关的操作。

    • change buffer是可以持久化的数据,在内存中有拷贝,也会被写入到磁盘上。

      • change buffer 中的操作应用到原数据页,得到最新结果的过程称为merge

      • 触发merge的情况

        • 访问数据页

        • 后台线程定期运行

        • 数据库正常关闭

      • 优点:减少读磁盘,语句的执行速度会得到明显的提升;避免占用内存,提高内存利用率;

      • change buffer用的是buffer pool里的内存,因此不能无限增大。

      • 使用 change buffer 的条件

        • 普通索引可以使用,唯一索引的更新就不能使用

          • 唯一索引不能使用的原因:唯一索引所有的更新操作都要先判断这个操作是否违反唯一性约束,这必须要将数据页读入内存才能判断,如果都已经读入到内存了,那直接更新内存会更快,就没必要使用change buffer了。

      • innodb处理的流程举例

        • 如果要在这张表中插入一个新记录(4,400)的话,InnoDB的处理流程是怎样的。

          • 这个记录要更新的目标页在内存

            • 对于唯一索引来说,找到3和5之间的位置,判断到没有冲突,插入这个值,语句执行结束;

            • 对于普通索引来说,找到3和5之间的位置,插入这个值,语句执行结束。

          • 这个记录要更新的目标页不在内存

            • 对于唯一索引来说,需要将数据页读入内存,判断到没有冲突,插入这个值,语句执行结束;

            • 对于普通索引来说,则是将更新记录在change buffer,语句执行就结束了。

      • change buffer的使用场景

        • 写多读少的业务,业务模型常见的就是账单类、日志类的系统。

        • 因为merge的时候是真正进行数据更新的时刻,而change buffer的主要目的就是将记录的变更动作缓存下来,所以在一个数据页做merge之前,change buffer记录的变更越多(也就是这个页面上要更新的次数越多),收益就越大。

  • 索引的选择和实践

    • 所有的更新后面,都马上伴随着对这个记录的查询,那么你应该关闭change buffer。而在其他情况下,change buffer都能提升更新性能。

  • redo log

    • 在MySQL里也有这个问题,如果每一次的更新操作都需要写进磁盘,然后磁盘也要找到对应的那条记录,然后再更新,整个过程IO成本、查找成本都很高。

    • WAL技术,WAL的全称是Write-Ahead Logging,它的关键点就是先写日志,再写磁盘

    • 更新过程

      • 当有一条记录需要更新的时候,InnoDB引擎就会先把记录写到redo log里面,并更新内存,这个时候更新就算完成了。同时,InnoDB引擎会在适当的时候,将这个操作记录更新到磁盘里面,而这个更新往往是在系统比较空闲的时候做

    • InnoDB的redo log是固定大小的,写到末尾就又回到开头循环写。

    • write pos是当前记录的位置,一边写一边后移

    • checkpoint是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到数据文件。

    • write pos和checkpoint之间的是空着的部分,可以用来记录新的操作。

    • 如果write pos追上checkpoint,表示满了,这时候不能再执行新的更新,得停下来先擦掉一些记录,把checkpoint推进一下。

    • crash-safe :可以保证即使数据库发生异常重启,之前提交的记录都不会丢失

  • change buffer和redo log之间的对比

    • redo log 主要节省的是随机写磁盘的IO消耗(转成顺序写),而change buffer主要节省的则是随机读磁盘的IO消耗。

  • 小结

    • 问题1:系统表空间跟数据表空间这两个概念各是什么意思.

      • 系统表空间就是用来放系统信息的,比如数据字典什么的,对应的磁盘文件是ibdata1

      • 数据表空间就是一个个的表数据文件,对应的磁盘文件就是 表名.ibd

    • 问题2:change buffer一开始是写内存的,那么如果这个时候机器掉电重启,会不会导致change buffer丢失呢?

      • 会导致change buffer丢失,会导致本次未完成的操作数据丢失,但不会导致已完成操作的数据丢失。

      • change buffer中分两部分,一部分是本次写入未写完的,一部分是已经写入完成的。

      • 针对未写完的,此部分操作,还未写入redo log,因此事务还未提交,所以没影响。

      • 针对已经写完成的,可以通过redo log来进行恢复。

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

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

相关文章

开源数据集分享——猫脸码客

开源数据集分享,让数据更自由流通——猫脸码客带你走进数据的新世界 在数字化时代的浪潮中,数据已经成为推动社会进步的重要力量。然而,数据的获取与利用往往受到种种限制,使得许多有价值的信息难以被充分挖掘。幸运的是&#xf…

linux下安装mysql和主从搭建_亲测成功

linux下安装mysql和主从搭建_亲测成功 linux下安装mysql yum list installed | grep mysql #查看系统中是否已安装mysql软件yum -y remove mysql-libs.x86_64 #删除mkdir -pv /data/softwarecd /data/software/wget http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.2…

适配器模式【结构型模式C++】

1.概述 适配器模式是一种结构型设计模式, 又称为变压器模式、包装模式(Wrapper) 将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。 2.结构 Target:适配…

Leetcode算法训练日记 | day31

专题九 贪心算法 一、分发饼干 1.题目 Leetcode:第 455 题 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的…

MongoDB的使用场景

MongoDB的使用场景 MongoDB 是一个流行的文档型 NoSQL 数据库,适用于处理结构灵活、快速变化的数据以及需要高性能、高可用性和水平扩展能力的应用场景。以下是 MongoDB 的主要使用场景: Web & Mobile Applications: 实时数据处理:Mongo…

【算法一则】矩阵置零 【矩阵】【空间复用】

题目 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2: …

冰达ROS机器人快速使用指南

欢迎来到《冰达ROS机器人极简使用指南》 Q:这份教程适合谁? A:适合完全0基础新手,需要快速跑起来机器人的基本功能。也适合技术大佬需要快速的了解冰达ROS机器人的使用方法。 Q:这份教程内容很少,是不是…

c# 反射的应用

简述: 反射指程序可以访问、检测和修改它本身状态或行为的一种能力。 程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。 您可以使用使用反射获取类型,根据类型来动态创建对象&#…

机器学习基本流程

Jupyter Notebook 代码连接: machine_learning_demo machine_learning_ensembles Step 1: Imports and Configuration import pandas as pd import numpy as np import copy import json import pickle import joblib import lightgbm as lgb import optuna impor…

【24届数字IC秋招总结】正式批面试经验汇总8——豪威、大普微

文章目录 一、豪威-数字电路设计工程师1.1 面试问题二、大普微-数字验证工程师2.1 一面面试问题2.2 二面面试问题2.3 hr面试问题一、豪威-数字电路设计工程师 面试时间:9.6 1.1 面试问题 1、 logic能不能随机产生x和z,如何产生 2、 断言怎么写的,a为高b为高 3、 讲下项目…

数据结构——7.17.2 查找的基本概念、顺序查找和折半查找

7.1&7.2 查找的基本概念、顺序查找和折半查找 1. 基本概念 1. 关键字:数据元素中标识该元素的某个数据项的值,使用基于关键字的查找,查找结果应该是唯一的。2. 查找表的常见操作1. 查找符合条件的数据元素:查得快即可2. …

国产数据库实践:亚信安慧AntDB在DTC 2024展示创新实力

4月12至13日,我国数据库行业最具影响力的活动之一——第十三届『数据技术嘉年华』(DTC 2024) 在京成功举办,业内众多专家学者、技术领袖、各行业客户和实力厂商均到场参会。亚信安慧AntDB数据库总架构师洪建辉受邀参与“数据库一体化”专题论坛&#xff…

Stylus精讲:网页设计新境界【写作AI一键生成】

首先,这篇文章是基于笔尖AI写作进行文章创作的,喜欢的宝子,也可以去体验下,解放双手,上班直接摸鱼~ 按照惯例,先介绍下这款笔尖AI写作,宝子也可以直接下滑跳过看正文~ 笔尖Ai写作:…

《HCIP-openEuler实验指导手册》1.1Apache安装与测试

一、安装httpd 查看软件仓库中apache版本列表 dnf provides http 安装apache dnf install -y httpd 二、启动http并测试 查看apache版本号 httpd -v 检查配置文件是否正确 httpd -t 启动并设置为开机启动 systemctl enable httpd --now 或 systemctl enable httpd syst…

Android--ConnectivityManager使用

一、前言 Android10之后官方废弃了通过WifiManager连接WIFI的方式,现在要使用ConnectivityManager连接WIFI 二、连接WIFI public class MainActivity extends AppCompatActivity {private static final String TAG"lkx";Overrideprotected void onCrea…

yolov8实战第七天——pyqt5-yolov8实现车牌识别系统(参考论文(约7000字)+环境配置+完整部署代码+代码使用说明+训练好的模型)

基于 pyqt5-yolov8实现车牌识别系统,包括图片车牌识别,视频车牌识别,视频流车牌识别。 效果展示(图片检测,检测到的内容添加到历史记录): 效果展示(视频检测,视频车辆只会添加一条记录,下文更多实际应用中的优化策略): 基于YOLOv8和PyQt5的车牌识别系统设计与…

day60 接雨水 柱状图中的最大矩形

题目1:42 接雨水 题目链接:42 接雨水 题意 n个宽度为1高度不一致的柱子排列,可以接多少雨水 找寻当前柱子的左面第一个比该柱子高的(栈顶的下一个元素),右面第一个比该柱子高的(当前遍历的元素),作差 得到宽度&…

CUDA_cudaFree_释放Stream_cudaError_t 错误类型码解释

官方网站 : CUDA Runtime API :: CUDA Toolkit Documentation cudaFree() 说明 cudaFree() 是 CUDA 中用于释放由 cudaMalloc() 或 cudaMallocManaged() 分配的设备内存的函数。它的参数是一个指向设备内存的指针,用于指示要释放的内存块的起始地址。…

在React项目中试用Tailwind

TailwindCSS TailwindCSS 是一个套 CSS 的工具类,把常用的功能都进行了定义,下面是一个官网的例子,可以看到Tailwind对一元页面素写了很多类,日常开发中只要定义一两个类就可以搞定类似的功能了。这里写了这么多 p-6 max-w-sm mx…

java导出数据到excel表中

java导出数据到excel表中 环境说明项目结构1.controller层2.service层3.实现层4.工具类:ExcelUtil.java5.ProductModel.java类 使用的Maven依赖postman请求展示,返回内容需要前端接收浏览器接收说明(如果下载下来的为zip类型,记得…