首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一周技术学习笔记(第70期)-理解数据库的这两个问题,面试官会对你另眼相看

一周技术学习笔记(第70期)-理解数据库的这两个问题,面试官会对你另眼相看

作者头像
王新栋
发布于 2022-12-01 07:08:34
发布于 2022-12-01 07:08:34
2700
举报
文章被收录于专栏:程序架道程序架道

为什么会有数据库的事务隔离级别

从我们学习关系型数据库的时候就知道了数据库有四种隔离级别。那么为什么要做隔离级别这样的设置呢。

TIP:MySQL有四种隔离级别,Oracle有两种隔离级别。

任何一种数据库在数据存储的同时都不得不面临性能问题的考虑,另外关系型数据库事务的ACID这四种特性,真的需要同时满足吗。

其实,对于大多数应用系统来讲,事务的原子性和持久性肯定是要保证的,不然事务就没有存在的必要性了。但是,一致性和隔离性多少都是可以牺牲的,然后来换取性能。

这样便有了隔离级别。

比如,可重复读这个隔离级别,事务A获取了一份数据,在事务A还没有结束的时候,事务B开始更新同一份数据,如果事务A能够得到更新的数据,则表明事务A是不可重复读的,也就说明隔离性差,隔离性差就说明数据库在保持数据一致性上”使用的劲“小,数据库在整体的性能上表现的就更好些。不然,如果事务A是可重复读的,那数据库就要付出”更大的劲“,然后性能自然就下降些。

所以为了这样的平衡,数据库有了这样的事务隔离级别,按需索取。为了平衡性能和准确性,提出了不同的隔离级别,用户就可以按照自己的需求去平衡选择。

这样的平衡,有时候我们也可以说是在数据的一致性设计上的”无奈“。除了有ACID不能同时满足的无奈,分布式CAP理论也从分布式环境中描述了一种无奈。

CAP 定理决定了 C 与 A 不可兼得,传统的 ACID 强一致性在分布式环境中,要想能保证一致性(C),就不得不牺牲可用性(A)。

那么这个时候,随着分布式系统中节点数量的增加,整个系统发生服务中断的概率和时间都会随之增长。所以,我们只能退而求其次,把“最终一致性”作为分布式架构下事务处理的目标。

可靠事件队列、TCC 和 SAGA,都是实现最终一致性的三种主流模式。

为什么要分库分表

任何数据库存储系统,每一次查询数据的时候所耗费的时间,都取决于两个因素:

1、查找时间的复杂度;

2、数据总量;

查找时间的复杂度,又取决于两个因素:

1、查找算法;

2、存储数据的数据结构

算法和数据结构,都是由数据库本身实现的,我们基本改变不了,业务系统更没有办法改变它。

MySQL 在 InnoDB 存储引擎下创建的索引都是基于 B+ 树实现的,所以查询时的 I/O 次数很大程度取决于树的高度,随着 B+ 树的树高增高,I/O 次数增加,查询性能也就越差。

所以最后只剩下,数据总量,这一个抓手。

所以,我们就开始分库分表。

搞不定算法,就搞定数据量。

这里,问你一个问题,如果是并发高,侧重点是分库?还是分表?

答案是分库,分库涉及到数据库实例的粒度,一个数据库实例扛不住,就把请求分散到更多的实例上,这跟我们的应用维度抗用户量的道理是一样的。

不过呢,我们一般分库分表是同时进行的。

但是,分库分表还有一个”能不就不“原则:能不拆就不拆,能少拆就不多拆。

拆,这个动作,跟我们从单体到微服务一样,微服务自然有它的优势,但应用服务节点多了,跨进程依赖关系就多了,可能出错的节点也多了,同时也给我们的维护工作带来一定挑战,当然,总体是利大于弊的。

这里的分库分表也是一样。数据拆分得越散,开发和维护起来就越麻烦,系统出问题的概率就越大。

都已经有了Redis这样的NoSql数据库了,还要关系型数据库干嘛

Redis在分布式环境中的作用确实很大,我们用它来做分布式缓存减轻后端数据库的压力,用它来做分布式锁确保应用程序的一致性,在这两种场景下Redis极大的帮助我们处理了分布式环境下既需要抗住用户的高并发请求又需要保证数据一致性的”窘境“。

但是Redis也不是万能的。

比如,我们用它来做缓存的时候,当然是希望缓存的命中率越高越好。在缓存商品数据、用户搜索这样的场景下,每个最终用户所看到的数据都是一样的,此时Redis缓存的命中率自然是非常高的。但是像我的订单这样的场景,不同的用户要看到不同的数据内容,缓存的命中率相对就没有那么高了,这种情况下就会有一部分请求到数据库上。

Redis本身是不可靠的存储,它有丢失数据的可能性,也不支持事务查询,另外自由的查询能力也太弱,而我们的应用需求场景中往往需要各种各样的查询需求。基于这些现实的情况,一方面是我们不可能抛弃我们的关系型数据库,另外一方面我们也只能在局部的环境下使用Redis。

----END----

这里记录,我每周碰到的,或想到的,引起触动,或感动的,事物的思考及笔记。不见得都对,但开始思考记录总是好的。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序架道 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
大厂面试系列(八):数据库mysql相关
数据库相关 mysql索引的数据结构,加索引的原则 InnoDB和myiasm的区别,以及常见的mysql优化方案 sql查询优化 说说Mysql的sql优化 mysql的索引,b+树索引是否支持范围查询,联合索引的失效情况 开发中用了那些数据库?回答mysql,储存引擎有哪些?然后问了我悲观锁和乐观锁问题使用场景、分布式集群实现的原理。 数据库索引原理 mysql索引 B+树原理 mysql索引是怎么实现的?b+树有哪些特点?真实的数据存在哪里?哪些情况下建索引?解释下最左匹配原则?现在一个表有三列a
zhaozhen
2021/07/15
1.1K0
数据库-面试
共享锁也称为读锁,相互不阻塞,多个客户在同一时刻可以同时读取同一个资源而不相互干扰。
知识浅谈
2022/02/25
1.2K0
[数据库]-基础面试题总结
drop(丢弃数据): drop table 表名 ,直接将表(表结构和数据)都删除掉,在删除表的时候使用。 truncate (清空数据) : truncate table 表名 ,只删除表中的数据,再插入数据的时候自增长 id 又从 1 开始,在清空表中数据的时候使用。 delete(删除数据) : delete from 表名 where 列名=值,删除某一列的数据,如果不加 where 子句和truncate table 表名作用类似。但是再进行插入的话自增id并不是从1开始,而是接着之前的自增开始。 truncate 和不带 where 子句的 delete、以及 drop 都会删除表内的数据,但是 truncate 和 delete 只删除数据不删除表的结构(定义),执行 drop 语句,此表的结构也会删除,也就是执行 drop 之后对应的表不复存在。
无敌小菜鸟
2021/12/13
7190
[数据库]-基础面试题总结
浅谈MySQL数据库面试必要掌握知识点
MySQL安装有多种方式,可使用yum安装,也可以从官网下载指定版本解压安装既可,比较简单,安装完完成配置文件,linux下配置文件为my.cnf,windows配置文件为my.ini。
落寞的鱼丶
2021/12/13
7380
MySQL数据库面试题:如何优化呢?
在数据库开发中,创建表是一个至关重要的步骤,优化设计可以显著提升数据库的性能和效率。让我们一起来探讨在MySQL数据库面试中关于表创建及优化的一些问题和技巧。
IT_陈寒
2023/12/13
2760
关系型数据库和非关系型数据库
事务,是指一个操作序列,这些操作要么都执行,或者都不执行,而且这一序列是无法分隔的独立操作单位。也就是符合原子性(Atomicity)、 一致性(Consistency)、 隔离性(Isolation)和持久性(Durability)的一组操作。
归思君
2023/10/16
1.2K0
关系型数据库和非关系型数据库
美团疯狂问基础,可惜没把握住!
可重复读解决了脏读和不可重复读的问题,但是可能会出现幻读的问题。在这个隔离级别下,同一个事务内的多次读取结果是一致的,不同事务之间的读取结果互不干扰。
千羽
2023/12/13
2510
美团疯狂问基础,可惜没把握住!
mysql数据库面试题目及答案_java面试数据库常见问题
其他面试题类型汇总: Java校招极大几率出的面试题(含答案)—-汇总 几率大的网络安全面试题(含答案) 几率大的多线程面试题(含答案) 几率大的源码底层原理,杂食面试题(含答案) 几率大的Redis面试题(含答案) 几率大的linux命令面试题(含答案) 几率大的杂乱+操作系统面试题(含答案) 几率大的SSM框架面试题(含答案) 几率大的数据库(MySQL)面试题(含答案) 几率大的JVM面试题(含答案) 几率大的现场手撕算法面试题(含答案) 临时抱佛脚必备系列(含答案) 注:知识还在积累中,不能保证每个回答都满足各种等级的高手们,若发现有问题的话,本人会尽快完善。 。◕‿◕。
全栈程序员站长
2022/09/27
1K0
mysql数据库面试题目及答案_java面试数据库常见问题
MySQL面试题全解析:准备面试所需的关键知识点和实战经验
MySQL支持多种数据存储引擎,其中最常见的是MyISAM和InnoDB引擎。可以通过使用"show engines"命令查看MySQL支持的存储引擎。
努力的小雨
2023/11/09
4190
精通CRUD,却搞不懂数据库的基本原理?
作为一个程序员,不了解数据库怎么能行,那么数据库到底是个啥呢,作为一个Java工程师,平时和数据库打交道着实不少,所谓的CRUD其实就是对数据库进行增删改查的操作。
Java技术江湖
2020/03/04
7470
精通CRUD,却搞不懂数据库的基本原理?
美团面试官:说说你对数据库分库分表的理解?
关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单表的数据量达到1000W或100G以后,由于查询维度较多,即使添加从库、优化索引,做很多操作时性能仍下降严重。此时就要考虑对其进行切分了,切分的目的就在于减少数据库的负担,缩短查询时间。
Bug开发工程师
2020/03/12
1.4K0
美团面试官:说说你对数据库分库分表的理解?
100道MySQL数据库经典面试题解析(收藏版)
可以从几个维度去看这个问题,查询是否够快,效率是否稳定,存储数据多少,以及查找磁盘次数,为什么不是二叉树,为什么不是平衡二叉树,为什么不是B树,而偏偏是B+树呢?
捡田螺的小男孩
2020/05/26
2.7K0
100道MySQL数据库经典面试题解析(收藏版)
Java面试——数据库
【1】Read Uncommitted(读取未提交内容):出现脏读,也就是可能读取到其他会话中未提交事务修改的数据。 【2】Read Committed(读取已提交内容):不可重复读,只能读取到已经提交的数据。Oracle 等数据库默认的隔离级别。 【3】Repeatable Read(可重复读):出现幻读。在同一个事务内的查询都和事务开始时刻一致。InnoDB默认级别。 【4】Serializable(串行读):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞。
Java架构师必看
2021/05/06
6720
Java面试——数据库
小米DBA工程师一面
​ DBA工程师需要性能优化,安全管理,容灾备份,监控和调优,版本管理,自动化脚本编写能力。
GeekLiHua
2025/01/21
1270
2020数据库面试题
常见的MySQL主要有两种结构:Hash索引和B+ Tree索引,我们使用的是InnoDB引擎,默认的是B+树
Tim在路上
2020/08/04
7980
MySQL知识体系(DS整理)
存储引擎(Storage Engine)是数据库管理系统中负责数据存储、检索和管理的核心组件,它决定了:
Him
2025/05/04
3430
【Java面试总结】MySQL
字符集指的是一种从二进制编码到某类字符符号的映射。校对规则则是指某种字符集下的排序个规则。
Rochester
2020/09/15
5330
【Java面试总结】MySQL
Java面试考点6之消息队列
先来看看相关知识点汇总,如下图。首先为了防止歧义进行说明,本课时中提到的“队列“就是指“消息队列“。
马拉松程序员
2022/04/26
3690
Java面试考点6之消息队列
聊聊主流的分布式数据库
单体数据库时代,随着系统交易量的不断上升,数据库读写性能出现了严重下降。我们可以借助分库分表中间件,比如mycat、shardingjdbc来实现分库分表,缓解单库的读写性能。但是分库分表中间件并不支持事务,如果要保证数据一致性,就需要借助于分布式事务中间件,比如阿里巴巴的seata。后来分布式数据库逐渐成为解决数据一致性的选择,目前分布式数据库产品已经比较成熟,支持ACID事务,本文就来聊一聊分布式数据库。
jinjunzhu
2021/01/05
1.9K0
聊聊主流的分布式数据库
为什么你精通CRUD,却搞不懂数据库的基本原理?
作为一个程序员,不了解数据库怎么能行,那么数据库到底是个啥呢,作为一个Java工程师,平时和数据库打交道着实不少,所谓的CRUD其实就是对数据库进行增删改查的操作。
程序员黄小斜
2020/02/25
9970
相关推荐
大厂面试系列(八):数据库mysql相关
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档