数据库(3)

news2025/6/8 10:31:29

目录

11.那你知道什么是覆盖索引和回表吗?

12.什么是MVCC?说说MySQL实现MVCC的原理?

13.MySQL的锁的类型有哪些呢?

14.你们数据量级多大?分库分表是怎么做的?

15.分表后非分库字段sharding_key的查询怎么处理呢?


11.那你知道什么是覆盖索引和回表吗?

覆盖索引指的是在一次查询中,如果一个索引包含或者说覆盖所有需要查询的字段的值,我们就称之为覆盖索引,而不再需要回表查询。

而要确定一个查询是否是覆盖索引,我们只需要explain SQL语句看Extra的结果是否是"Using index"即可。

比如:

explain select * from user where  age=1;
explain select id,age from user where age=1;
12.什么是MVCC?说说MySQL实现MVCC的原理?

什么是MVCC?

MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。在Mysql的Innodb引擎中就是指在已提交读(read committed)和可重复读(repeatable read)这两种隔离级别下的事务对于SELECT操作会访问版本链中的记录的过程。这就使得别的事务可以修改这条记录,反正每次修改都会在版本链中记录。SELECT可以去版本链中拿记录,这就实现了读-写,写-读的并发执行,提升了系统的性能。

MySQL的innodb引擎实现MVCC的3个基础点

         1.隐式字段

         2.undo log

        不同事务或者相同事务的对同一记录的修改,会导致该记录的undo log成为一条记录版本线性表,即链表,undo log的链首就是最新的旧记录,链尾就是最早的旧记录。

        3.readview

        已提交读和可重复读的区别就在于它们生成readview的策略不同。

        readview中主要就是有个列表来存储我们系统中当前活跃着的读写事务,也就是begin了还未提交的事务。通过这个列表来判断记录的某个版本是否对当前事务可见。假设当前列表里面的事务id为[80,100]。

        1)如果你要访问的记录版本的事务id为50,比当前列表最小的id 80小,那说明这个事务在之前就提交了,所以对当前活动的事务来说是可访问的。

        2)如果你要访问的记录版本的事务id为90,发现此事务在列表id最大值和最小值之间,那就再判断一下是否在列表内,如果在那就说明此事务还未提交,所以此版本不能被访问。如果不再那说明此事务已经提交,所以版本可以被访问。

        3)如果你要访问的记录版本的事务id为110,那比事务列表最大的id 100都大,那说明这个版本是在readview生成之后才发生的,所以不能被访问。

这些记录都是undo log链里面找的,先找最近记录,如果最近这一条记录事务id不符合条件,不可见的话,再去找上一个版本再比较当前事务id和这个版本事务id看能不能访问,以此类推直到返回可见的版本或者结束。

举个例子,在已提交读隔离级别下:

比如此时有一个事务id为100的事务。修改了name,使得的name等于小明2,但是事务还没有提交。则此时的版本链是

那此时另一个事务发起了select语句要查询id为1的记录,那此时生成的readview列表只有[100]。那就去版本链去找了,首先肯定找最近的一条,发现trx_id是100,也就是name 为小明2的那条记录,发现在列表内,所以不能访问。

这时候就通过指针继续找下一条,name为小明1的记录发现trx_id是60,小于列表中的最小id,所以可以访问,直接访问结果为小明1.

那这时候 我们把事务ID为100的事务提交了,并且新建了一个事务id为110也修改id为1的记录,并且不提交事务。

这时候之前那个select事务又执行了一次查询,要查询id为1的记录。

已提交读隔离级别下的事务在每次查询的开始都会生成一个独立的readView,而可重复读 隔离 级别则在第一次读的时候生成一个readview,之后的读都复用之前的readview。 

        1)如果你是已提交读隔离级别,这时候你会重新一个readview,那你的活动事务列表中的值就变了,变成了[110]。按照上的说法,你去版本链通过trx_id对比查找到合适的结果就是小明2。

        2)如果你是可重复读隔离级别,这时候 你的readview还是第一次select时候生成的readview,也就是列表的值还是[100]。所以select 的结果是小明1。所以第二次select结果和第一次一样,所以叫可重复读。

这就是mysql的MVCC,通过版本链,实现多版本,可并发读-写,写-读。通过readview生成策略的不同实现不同的隔离级别。

13.MySQL的锁的类型有哪些呢?

说两个维度:

共享锁(简称S锁)和排他锁(简称X锁)

读锁是共享的,可以通过lock in share mode实现,这时候只能读不能写。

写锁是排他的,它会阻塞其他的写锁和读锁。从颗粒度来区分,可以分为表锁和行锁两种。

表锁和行锁

表锁会锁定整张表并且阻塞其他用户对该表的所有读写操作,比如alter修改表结构的时候会锁表。

行锁又可以分为乐观锁和悲观锁。

悲观锁可以通过for update实现。

乐观锁则通过版本号实现。

两个维度结合来看:

共享锁(行锁):shared locks

读锁(s锁),多个事务对于同一数据可以共享访问,不能操作修改。

使用方法:

加锁: select * from table where id=1 lock in share mode

释放锁:commit/rollback

排他锁(行锁):Exclusive Locks

写锁(X锁),互斥锁/独占锁,事务获取了一个数据的X锁,其他事务就不能再获取该行的读锁和写锁(S锁、X锁),只有获取了该排他锁的事务是可以对数据进行读取和修改。

使用方法:

delete/update/insert --加锁

select * from table where ... for update --加锁

commit/rollback  --释放锁

意向共享锁(IS)

一个数据行加共享锁前必须先取得该表的IS锁,意向共享锁之间是可以相互兼容的,意向排他锁(IX)一个数据行加排他锁前必须先取得该表的IX锁,意向排他锁之间是可以相互兼容的,意向锁(IS、IX)是Innodb引擎操作数据之前自动加的,不需要用户干预;意义:当事务操作需要锁表时,只需要判断意向锁是否存在,存在时则可快速返回该表不能启用表锁。

意向共享锁(IS锁)(表锁):intention shared locks

表示事务准备给数据行加入共享锁,也就是说一个数据行加共享锁前必须先取得该表的IS锁。

意向排他锁(IX锁)(表锁):intention exclusive locks

表示事务准备给数据行加入排他锁,说明事务在一个数据行加排他锁前必须先取得该表的IX锁。

14.你们数据量级多大?分库分表是怎么做的?

首先分库分表分为垂直和水平两个方式,一般来说我们拆分的顺序是先垂直后水平。

垂直分库

基于现在的微服务拆分来说,都是已经做到了垂直分库了。

垂直分表

垂直切分是将一张表按照列切分成多个表,通常是按照列的关系密集程度进行切分,也可以利用垂直切分将经常被使用的列和不经常使用的列切分到不同的表中。

在数据库的层面使用垂直切分将数据库中表的密集程度部署到不同的库中。例如将原来的电商数据库垂直切分成商品数据库、用户数据库。

水平分表

首先根据业务场景来决定使用什么字段作为分表字段(sharding_key),比如我们现在的日订单1000万。我们大部分的场景来源于C端,我们可以使用user_id作为sharding_key,数据查询支持到最近3个月的订单,超过3个月的做归档处理,那么三个月的数据量就是9亿,可以分1024张表,那么每张表的数据也就大概在100万左右。

比如用户id为100,那我们都经过hash(100),然后对1024取模,就可以落到对应的表上了。

那分表后的id怎么保证唯一性呢?

因为我们主键默认都是自增的,那么分表之后的主键在不同表就肯定会有冲突了。有几个办法考虑:

设定步长,比如1-1024张彪我们分别设定1-1024的基础步长,这样子主键落到不同的表就不会冲突了。

分布式ID,自己实现一套分布式ID生成算法或者使用开源的比如雪花算法这种。

分表后不使用主键作为查询依据,而是每张表单独新增一个字段作为唯一主键使用,比如订单表订单号是唯一的,不管最终落在哪张表都基于订单号座位查询依据,更新也一样。

15.分表后非分库字段sharding_key的查询怎么处理呢?

可以做一个mapping表,比如这时候商家要查询订单列表怎么办呢?不带user_id查询的话你总不能扫描全表吧,所以我们可以做一个映射关系表,保存商家和用户的关系,查询的时候先通过商家查询到用户列表,再通过user_id去查询。

一般而言,商户端对数据实时性要求并不是很高,比如查询订单列表,可以把订单列表同步到离线(实时)数仓,再基于数仓去做成一张宽表,在依据其他如ES 提供查询服务。

数据量不是很大的话,比如后台的一些查询之类的,也可以通过多线程扫表,然后再聚合结果的方式来做。或者异步的形式也是可以的。

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

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

相关文章

OSCP靶场--ClamAV

OSCP靶场–ClamAV 考点 1.nmap扫描 ##┌──(root㉿kali)-[~/Desktop] └─# nmap -sV -sC 192.168.153.42 -p- -Pn --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-04-13 10:01 EDT Nmap scan report for 192.168.153.42 Host is up (0.24s latency). N…

现在租一个服务器多少一个月?

现在租一个服务器多少一个月?优惠价格低至3.8元1个月,租用一个月云服务器收费价格表:阿里云和腾讯云2核2G3M服务器优惠价格61元一年,折合一个月5元,京东云轻量云主机5.8元一个月,华为云服务器优惠价格3.8元…

口型动画论文2:《基于语音驱动的表情动画设计与实现》

说明 本文是北京邮电大学的硕士毕业论文,作者是郭梦婷。由于是艺术硕士,所以本文没有罗列很多公式,而是从动画创作的角度来写如何根据语音设计动画人物的嘴型及表情。本文作者行文缜密、轻松,举得例子都是一些热播的动画和电影&a…

机器人坐标系转换之从世界坐标系到局部坐标系

三角函数实现 下面是代码c和python实现&#xff1a; #include <iostream> #include <cmath>struct Point {double x;double y; };class RobotCoordinateTransform { private:Point origin; // 局部坐标系的原点在世界坐标系中的坐标public:RobotCoordinateTransfo…

康耐视visionpro-CogBlobTool工具操作详细说明

CogBlobTool功能说明: 通过设置灰度值提取感兴趣区域,并分析所提取区域的面积、长宽等参数。 Cog BlobTool操作说明: .打开工具栏,双击或点击鼠标拖拽添加CogBlobTool工具 ②.添加输入图像:单击鼠标右键“链接到”或以连线拖拽的方式选择相应输入源 ③.极性: “白底黑点…

计算机毕业设计Python+Flask电商商品推荐系统 商品评论情感分析 商品可视化 商品爬虫 京东爬虫 淘宝爬虫 机器学习 深度学习 人工智能 知识图谱

一、选题背景与意义 1.国内外研究现状 国外研究现状&#xff1a; 亚马逊&#xff08;Amazon&#xff09;&#xff1a;作为全球最大的电商平台之一&#xff0c;亚马逊在数据挖掘和大数据方面具有丰富的经验。他们利用Spark等大数据技术&#xff0c;构建了一套完善的电商数据挖…

H2O-3机器学习平台源码编译的各种坑

H2O-3机器学习平台是一个非常适合非专业人士学习机器学习的平台&#xff0c;自带WebUI&#xff0c;效果还是蛮不错的&#xff0c;官方也提供了jar包&#xff0c;一条命令就能直接运行&#xff0c;非常方便&#xff0c;但最近有源码编译的需求&#xff0c;实际操作过程中&#x…

Unity打包出来的apk安装时提示应用程式与手机不兼容,无法安装应用程式

1、遇到的问题 * 2、解决办法 这是因为你在Unity中导出来的apk手机安装包是32位的&#xff0c;才导致上述问题发生&#xff0c;要解决这个办法&#xff0c;需要在Unity中导出64位的手机安装包。 32位跟64位的区别&#xff0c;以及如何区分打出来的手机安装包是否是32位或者是…

ssm046人事管理信息系统+jsp

人事管理信息系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本人事管理信息系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短…

中仕公考:三支一扶期满后有编制吗?

三支一扶两年的期限到达之后&#xff0c;会自动获得编制吗? 完成三支一扶项目的服务期限后&#xff0c;参与人员必须通过正式的考试才能获得编制&#xff0c;而并不是期满后自动获得编制。但是&#xff0c;三支一扶服务期满人员在参加公务员考试中可依照其身份享受加分的优惠…

Vue.js npm错误:transpileDependencies.map不是一个函数

这个错误通常是由于npm版本不兼容导致的。在旧版本的npm中&#xff0c;transpileDependencies是一个字符串数组&#xff0c;我们可以直接配置需要编译的依赖库。而在较新版本的npm中&#xff0c;transpileDependencies被改成了一个对象&#xff0c;并且需要使用map()方法来处理…

【C语言基础】:预处理详解(一)

文章目录 一、预定义符号二、#define定义常量三、#define定义宏四、带有副作用的宏参数五、宏替换的规则 一、预定义符号 在C语言中设置了许多的预定义符号&#xff0c;这些预定义符号是可以直接使用的&#xff0c;预定义符号也是在预处理阶段进行处理的。 常见的预定义符号&…

uniapp开发小程序手写板、签名、签字

可以使用这个插件进行操作 手写板-签名签字-lime-signature - DCloud 插件市场 但是目前这个插件没有vue3 setup Composition API的写法。所以对于此文档提供的可以直接使用,需要使用Composition API方式实现的,可以继续看。 因为Composition API方式,更加的简单、灵活,…

逆向案例二十三——某租逆向,总是有映射源文件怎么办以及分析webpack代码

网址&#xff1a;aHR0cHM6Ly93d3cubWFvbWFvenUuY29tLyMvYnVpbGQ 抓取数据包发现载荷以及数据都进行了加密&#xff1a; 定位方法一&#xff1a;直接搜decrypt(,进入js文件&#xff0c;可以发现就是直接AES的解密方法&#xff0c;打上断点&#xff0c; 下方的d是解密函数 现在有…

vscode配置c\c++及美化

文章目录 vscode配置c\c及美化1.安装vscode2.汉化3.安装c\c插件4.安装mingw5.配置mingw6. 运行c代码6.1 创建代码目录6.2 设置文件配置6.3 创建可执行任务&#xff1a;task.json6.4 编译执行6.5 再写其他代码6.6 运行多个c文件 7. 运行c文件8.调式代码8.1 创建launch.json8.2 修…

010、Python+fastapi,第一个后台管理项目走向第10步:ubutun 20.04下安装ngnix+mysql8+redis5环境

一、说明 先吐槽一下&#xff0c;ubuntu 界面还是不习惯&#xff0c;而且用的是云电脑&#xff0c;有些快捷键不好用&#xff0c;只能将就&#xff0c;谁叫我们穷呢&#xff1f; 正在思考怎么往后进行&#xff0c;突然发现没安装mysql 和redis&#xff0c;准备安装&#xff0…

shell 调用钉钉通知

使用场景&#xff1a;机器能访问互联网&#xff0c;运行时间任务后通知使用 钉钉建立单人群 手机操作&#xff0c;只能通过手机方式建立单人群 电脑端 2. 配置脚本 #!/bin/bash set -e## 上图中 access_token字段 TOKEN KEYWORDhello # 前文中设置的关键字 function call_…

Visual Studio code无法正常执行Executing task: pnpm run docs:dev

最近尝试调试一个开源的项目&#xff0c;发现cmd可以正常启动&#xff0c;但是在vs中会报错&#xff0c;报错内容如下 Executing task: pnpm run docs:dev pnpm : 无法加载文件 E:\XXXX\pnpm.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 http…

数据结构之单链表相关刷题

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构 数据结构之单链表的相关知识点及应用-CSDN博客 下面题目基于上面这篇文章&#xff1a; 下面有任何不懂的地方欢迎在评论区留言或…

【重回王座】ChatGPT发布最新模型gpt-4-turbo-2024-04-09

今天&#xff0c;新版GPT-4 Turbo再次在大型模型排行榜上荣登榜首&#xff0c;成功超越了此前领先的Claude 3 Opus。另外&#xff0c;新模型在处理长达64k的上下文时&#xff0c;性能竟能够与旧版在处理26k上下文时的表现相当。 目前GPT-4 Turbo仅限于ChatGPT Plus的用户&…