数据库(3)

目录

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 提供查询服务。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CSS中:root伪类的说明和使用

定义和用法 :root选择器用匹配文档的根元素。在HTML中根元素始终是HTML元素,所以也可以把:root理解为html根元素选择器,但是比html根元素的优先级高,:root伪类选择器常常被用于定义全局的CSS变量或者设置全局的CSS样式。CSS :root 选择器 | …

SecureCRT日志记录的7个经典配置记录与14个环境变量(%Y-%M-%D_%H_%S_session.log %t )

每次更换电脑、主机或者环境都需要配置一遍SecureCRT的参数。感觉就最近十年都已经设置过上百次了。其实设置没什么特别的,只是经过不断地打磨,主打的就是一个经济实用。经常忘记,特此记录。 配置方式 建议直接配置默认session:…

Codeforces Round 938 (Div. 3)(A,B,C,D,E,F,G,H)

题目链接 该死的调休,这几天基本都是满课,要么就是两三场比赛打满,根本补不完题,马上周末又是一堆比赛。最近CF不知道在抽什么风,动不动就要验我是不是机器人,然后转圈圈,再返回一个 “Oops&am…

正确使用@RequestMapping(包含属性详解)

目录 一、基本认知二、RequestMapping的基本使用三、深入学习RequestMapping1、RequestMapping的源码2、RequestMapping的属性2.1 path2.2 method2.3 params2.4 headers2.5 consumes2.6 produces2.7 name 一、基本认知 客户端发起Http请求,会提供一个URL [协议://域…

软件设计师——软件工程基础知识

软件工程基础知识 软件过程软件过程模型软件测试方法进度管理软件复杂性度量环路复杂度耦合聚合和组合 软件过程 软件过程模型 软件测试方法 黑盒测试和白盒测试 白盒测试中,语句覆盖对程序执行逻辑的覆盖很低,因此一般认为它是很弱的逻辑覆盖。 进度管…

企业常用命令(touch/别名/重定向/Linux字符)7368字详谈

企业高薪思维: 企业(工作/学习中)操作前备份,操作后检查 最小化原则 1.安装软件最小化 2.参数选项最小化 3.登录用户权限最小化(不用root登录) 要想成功/学习上/工作上 永远比别人多做一点点(别…

【智能优化算法】人工原生动物优化器(APO)

人工原生动物优化器(Artificial Protozoa Optimizer,APO)是发表在中科院一区期刊‘Knowledge-Based Systems’期刊上“Artificial Protozoa Optimizer (APO): A novel bio-inspired metaheuristic algorithm for engineering optimization”这篇文章上的算法。 01.引…

1.MMD模型动作场景镜头的导入及视频导出

界面介绍 MIKUMIKUDANCE926版本 MMD的工具栏模型骨骼帧的窗口,在不同时间做不同动作,可以在这里打帧操作时间曲线操作窗口,控制模型两个动作之间的过渡模型操作窗口,导入模型选择模型相机操作,控制相机远近&#xf…

【御控物联】物联网平台设备接入-JSON数据格式转化(场景案例四)

文章目录 一、背景二、解决方案三、在线转换工具四、技术资料 一、背景 物联网平台是一种实现设备接入、设备监控、设备管理、数据存储、消息多源转发和数据分析等能力的一体化平台。南向支持连接海量异构(协议多样)设备,实现设备数据云端存…

C/C++ 入门(4)类和对象(下)

个人主页:仍有未知等待探索-CSDN博客 专题分栏:C 请多多指教! 目录 一、const成员 二、再谈构造函数 1、初始化列表 2、explicit关键字 三、static成员 注意: 四、友元 1、友元函数 案例: 2、友元类 五、…

解决Xshell登录云服务器的免密码和云服务器生成子用户问题

Xshell登录云服务器的免密码问题 前言一、Xshell登录云服务器的免密码操作实践 二、centos创建用户创建用户实操删除用户更改用户密码直接删除子用户 前言 Xshell登录云服务器免密码问题的解决方案通常涉及使用SSH密钥对。用户生成一对密钥(公钥和私钥)…

第14章 大数据与数据科学知识点梳理

第14章 大数据与数据科学知识点梳理(附带页码) ◼ 原则:组织应仔细管理与大数据源相关的元数据,以便对数据文件及其来源和价值进行准确的清单管理。P386 ◼ 大数据:数据量大(Volume)、数据更新…

MySQL之sql优化:intsert、主键、order by、group by等

insert优化 批量插入 手动提交事务 主键顺序插入(将在主键优化中介绍) 大批量插入数据 如果一次性需要插入大批量地数据,使用insert语句插入性能较低,此时使用MySQL数据库提供地load指令进行插入 下图第三条语句表示讲/root/s…

【算法基础2】前缀和与差分

目录 前缀和与差分1.综述2.前缀和(1)一维前缀和(2)二维前缀和(子矩阵的和) 3.差分(1)一维差分(2)二维差分(差分矩阵) 前缀和与差分 1…

攻防世界---Web_php_include

1.题目链接 2.补充知识&#xff1a; 3.构造&#xff1a;执行成功 /?pagedata://text/plain,<?php phpinfo()?> 4.构造下面url&#xff0c;得到目录路径 /?pagedata://text/plain,<?php echo $_SERVER[DOCUMENT_ROOT]?> 5构造下面url&#xff0c;读取该路径的…

【Linux】进程基础铺垫(二)软件基础:操作系统 (Operator System)

操作系统 软件上 —— 操作系统 (Operator System)为什么要有操作系统的管理&#xff1f;&#xff08;一&#xff09;概念&#xff08;二&#xff09;设计OS的目的&#xff1a;为什么要有操作系统的管理&#xff1f;&#xff08;三&#xff09;定位&#xff08;四&#xff09;如…

B02、垃圾回收 算法 概念-6.1

1、概念 1.1、前言 垃圾收集&#xff0c;不是Java语言的伴生产物。早在1960年&#xff0c;第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。 垃圾收集机制是Java的招牌能力&#xff0c;极大地提高了开发效率。如今&#xff0c;垃圾收集几乎成为现代语言的标配&#…

系统架构最佳实践 -- 一般优惠券思想和方案

1.优惠券系统的核心思想 默认的优惠券系统&#xff1a;根据运营人员设定的条件生成对应的优惠券模板、 优惠券码的要求:唯一性和有一定的识别性 优惠券码的格式&#xff08;一共18位&#xff09;&#xff1a;产品线类型&#xff08;前四位&#xff09;日期随机码&#xff08;中…

大模型应用工具 LangChain 入门书籍: LangChain 简明讲义

书籍信息 书名&#xff1a;《LangChain 简明讲义&#xff1a;从 0 到 1 构建 LLM 应用程序》出版社&#xff1a;电子工业出版社书籍链接&#xff1a;https://item.jd.com/14105705.html书籍配套代码&#xff1a;https://github.com/kebijuelun/langchain_book 书籍背景 计算机…

道可云文旅元宇宙平台:全面赋能文旅产业数字化转型

随着科技的迅猛发展&#xff0c;元宇宙、人工智能和虚拟数字人等技术逐渐成为推动社会进步的重要力量。在这一背景下&#xff0c;道可云文旅元宇宙平台以其独特的创新理念和前沿技术&#xff0c;为数字文博领域带来了革命性的变革。 道可云文旅元宇宙平台运用先进的元宇宙、人…