关于数据库你应该知道的那些事儿
作者|Mahdi Yusuf
原文链接|https://architecturenotes.co/things-you-should-know-about-databases/
数据库存储了应用程序中大部分的信息,但我们对数据库的运作方式知之甚少。本文将讨论使用数据库时最重要的两个主题:索引和事务。
索引
索引是一种数据结构,有助于减少请求数据的查找时间(就像教科书的索引一样,它可以帮你找到正确的一页)。索引让我们跳过查询每条记录的繁琐任务,付出的代价是额外的存储、内存和更新(更慢的写入速度)的成本。
少量的数据很容易管理(班级出勤表),但当数据变多时(城市的出生登记)就不那么容易了。在一页纸上 VS 在一千页纸上找东西,你的方式会有什么变化?随着存储和收集的数据越来越多,在数据库中找到需要的数据会变得越来越慢,所以,我们会逐渐用上各种工具,比如索引就可以帮助我们快速获得相关数据。
索引的原理是按照搜索数据的逻辑来存储这些数据。比如想按名字搜索列表,就按照名字对列表进行排序。但是这种方法有几个问题,比如:
如果想以多种方式搜索数据怎么办?
该如何向列表中添加新数据?这样做快吗?
如何更新数据?
这些任务的时间复杂度是怎样的?
看来我们需要更好的方法来快速获得需要的无序数据。
比如下图,底层数据无序地分散在存储设备中,并被随机分配。现在,大多数生产型服务器都配备了固态硬盘(SSD),但在某些情况下,还是会需要机械硬盘(HDD),但随着固态硬盘价格的大幅下降,这种情况越来越少了。
+─────+─────────+──────────────+
| id | name | city |
+─────+─────────+──────────────+
| 1 | Mahdi | Ottawa |
| 2 | Elon | Mars |
| 3 | Jeff | Orbit |
| 4 | Klay | Oakland |
| 5 | Lebron | Los Angeles |
+─────+─────────+──────────────+
将少量数据写入内存很快,而且搜索起来也很快,但如果要搜索的数据无法完全存在内存中呢?或者从磁盘上读取所有数据的时间耗费太久该怎么办?
+──────────+─────────+───────────────────+
| id | name | city |
+──────────+─────────+───────────────────+
| 1 | Mahdi | Ottawa |
| 2 | Elon | Mars |
| 3 | Jeff | Orbit |
| 4 | Klay | Oakland |
| 5 | Lebron | Los Angeles |
| ... | ... | ... |
| 1000000 | Steph | San Francisco |
| 1001000 | Linus | Portland |
+───────+─────────+──────────────────────+
因此,开发者会使用某种字典(比如哈希表)和一种捷径来找到特定行,确认需要的数据是否在那儿,而不需要扫描整个磁盘。这也叫做索引的叶子节点(index leaf nodes),它们被赋予一个特定的列作为索引,可以存储匹配行的位置。
叶子节点是索引列和相应数据记录行在磁盘上位置间的映射,快速获取该行的方法就是通过索引列来引用某一行。扫描索引的速度会更快,因为这样寻找所需数据的时候不用读取一堆数据块,而且这样便于缓存,进一步加快了整个过程。
叶子节点的大小是统一的,我们会在每个块中尽可能多地存储叶子节点。由于这种结构需要在逻辑上对事物进行排序,双向链表可以很好地解决快速添加和删除数据的问题。
这样有两个好处:它允许我们向前或向后读取索引叶子节点,以及当我们删除或添加新行时,可以快速重建索引结构。
由于叶子节点在磁盘上并不是按顺序排列的,我们需要一种方法来获得正确的索引叶子节点。
B 树
可以想像, 在学校里学习 B 树时会让人抓狂,但它们很强大,也确实值得学习。
B+ 树是一个树形结构,每个中间节点都指向其各自叶子节点的最高节点值。这为找到需要的数据的索引叶子结点提供了一条清晰的路径。这种结构是自下而上建立的,因此一个中间节点覆盖所有叶子节点,直到我们到达顶部的根节点。这种树状结构是平衡的,因为整个树的深度是统一的。
B 树 vs. B+ 树
相比 B 树,B+ 树的主要优势是中间节点不存储任何数据,相反,所有的数据都被链接到叶子节点上,这样可以更好地缓存。其次,叶子节点是连着的,所以如果需要做索引扫描时只需要做一次线性遍历,而不是上下来回遍历整颗树,导致从磁盘加载更多的索引数据。
对数扩展 Logarithmic Scalability
大家都知道数据呈指数增长(公司估值最好也是这样),但数据的规模越大往往对我们越不利,而 B 树是对抗它首当其冲的工具。
根据中间节点可以存储的项目(M)以及树的深度(N),我们可以找到 M 和 N 的关系,下表列举了 M = 5 的情形。
Tree Height (N) | Index Leaf Nodes |
3 | 125 |
4 | 625 |
5 | 3125 |
6 | 15625 |
7 | 78125 |
8 | 390625 |
9 | 1953125 |
因此,当索引叶子节点的数量呈指数增长时,树的高度增长得相当缓慢(相对索引叶子节点的数量)。再加上平衡的树高,几乎可以立即查找到指向磁盘上实际数据的相关索引叶节点。
这也太美妙了!
事务
事务(Transaction)是指查询,写入或更新数据库中各种数据项的一个程序执行单元(Unit),由事务开始 Begin 和事务结束 Commit/Rollback 之间执行的所有操作组成。
ACID 是数据库管理系统为保证事务是正确执行而需具备的四个特性:
原子性 Atomicity
一致性 Consistency
隔离性 Isolation
持久性 Durability
下文将主要解释事务的隔离性(Isolation)。现在,大多数系统不需要人们手动管理事务,但这样增加的灵活性往往可以达到更好的效果。
数据价值,链接未来.在这一年之中,越来越多的企业开始践行数据驱动的价值发现之旅,尝试在各个层面引入数据和智能化的技术,分布式应用也日趋广泛,技术使得整个世界连接起来.本次大会围绕云.数据.智能组织前沿 ... 简介 时光荏苒,岁月如梭,然而技术的进步同样日新月异,转眼又来到总结一年的时刻,第八届数据技术嘉年华大会将于2018年11月16日~17日在北京市东三环中路61号富力万丽酒店盛大开启. 在数据库流行度 ... 简介 时光荏苒,岁月如梭,然而技术的进步同样日新月异,转眼又来到总结一年的时刻,第八届数据技术嘉年华大会将于2018年11月16日~17日在北京市东三环中路61号富力万丽酒店盛大开启. 在数据库流行度 ... 如果提示zhs16GBK无法连接.这就是说明你下载的navicat可能是英文版.自带的oci.dll没有中文字符集.我就遇到的是这种问题.这时候需要找一个安装好的中文版oracle.搜一下oci 就知 ... 0. 0.0. 历史文章整理 玩转 Spring Boot 入门篇 玩转 Spring Boot 集成篇(MySQL.Druid.HikariCP) 玩转 Spring Boot 集成篇(MyBat ... Spring Boot参考指南 作者 菲利普·韦伯,戴夫 Syer,约什 长,斯特凡 尼科尔,罗布 绞车,安迪·威尔金森,马塞尔 Overdijk,基督教 杜普伊斯,塞巴斯蒂安·德勒兹,迈克尔·西蒙斯 ... [技术那些事儿]LTE网络中的用户数据库HSS与传统2G/3G的HLR有何区别?能否融合组网? EPS HSS与HLR分别负责4G用户数据和2G/3G用户数据的存储,主要存在的两大不同为: (1)所存 ... MySQL数据库参数是数据库系统运行的关键配置信息,设置不合适的参数值可能会影响业务.本文列举了一些重要参数说明,更多参数详细说明,请参见MySQL官网. 修改敏感参数 若干参数相关说明如下:&quo ... 转自:http://blog.csdn.net/eseaqyq/article/details/7795023 -------------------------------------------- ...关于数据库你应该知道的那些事儿相关推荐
最新文章
热门文章