作者|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)。现在,大多数系统不需要人们手动管理事务,但这样增加的灵活性往往可以达到更好的效果。

关于数据库你应该知道的那些事儿相关推荐

  1. 嘉年华,历数风流人物

    数据价值,链接未来.在这一年之中,越来越多的企业开始践行数据驱动的价值发现之旅,尝试在各个层面引入数据和智能化的技术,分布式应用也日趋广泛,技术使得整个世界连接起来.本次大会围绕云.数据.智能组织前沿 ...

  2. 慧据价值 链接未来丨第八届数据技术嘉年华大会全议程呈现

    简介 时光荏苒,岁月如梭,然而技术的进步同样日新月异,转眼又来到总结一年的时刻,第八届数据技术嘉年华大会将于2018年11月16日~17日在北京市东三环中路61号富力万丽酒店盛大开启. 在数据库流行度 ...

  3. 慧据价值 链接未来丨第八届数据技术嘉年华大会全议程精彩呈现

    简介 时光荏苒,岁月如梭,然而技术的进步同样日新月异,转眼又来到总结一年的时刻,第八届数据技术嘉年华大会将于2018年11月16日~17日在北京市东三环中路61号富力万丽酒店盛大开启. 在数据库流行度 ...

  4. navicat连接oracle的错误:ora-12737:instant client light :unsupport server charater set ZHS16GBK解决办法。

    如果提示zhs16GBK无法连接.这就是说明你下载的navicat可能是英文版.自带的oci.dll没有中文字符集.我就遇到的是这种问题.这时候需要找一个安装好的中文版oracle.搜一下oci 就知 ...

  5. 玩转 Spring Boot 应用篇(搭建菜菜的店铺)

    0.  0.0. 历史文章整理 玩转 Spring Boot 入门篇 玩转 Spring Boot 集成篇(MySQL.Druid.HikariCP) 玩转 Spring Boot 集成篇(MyBat ...

  6. Spring Boot参考指南

    Spring Boot参考指南 作者 菲利普·韦伯,戴夫 Syer,约什 长,斯特凡 尼科尔,罗布 绞车,安迪·威尔金森,马塞尔 Overdijk,基督教 杜普伊斯,塞巴斯蒂安·德勒兹,迈克尔·西蒙斯 ...

  7. 转载自搜狐科技【技术那些事儿】LTE网络中的用户数据库HSS与传统2G/3G的HLR有何区别?能否融合组网?...

    [技术那些事儿]LTE网络中的用户数据库HSS与传统2G/3G的HLR有何区别?能否融合组网? EPS HSS与HLR分别负责4G用户数据和2G/3G用户数据的存储,主要存在的两大不同为: (1)所存 ...

  8. mysql云数据库 磁盘利用率_云数据库MySQL参数的那些事儿

    MySQL数据库参数是数据库系统运行的关键配置信息,设置不合适的参数值可能会影响业务.本文列举了一些重要参数说明,更多参数详细说明,请参见MySQL官网. 修改敏感参数 若干参数相关说明如下:&quo ...

  9. 数据库中死锁那些事儿

    转自:http://blog.csdn.net/eseaqyq/article/details/7795023 -------------------------------------------- ...

最新文章

  1. sd.js 2.0封装:更加简化请求传参内容
  2. 刻意练习:LeetCode实战 -- Task29. 加油站
  3. rman备份常用命令
  4. CYQ.Data 轻量数据层之路 使用篇-辅助工具枚举生成器 视频 C (二十)
  5. leetcode A String Replacement Problem---流程图
  6. 严重: A child container failed during start
  7. python算法详解张玲玲电子版_算法之路该如何学习?
  8. SAP S/4HANA: 一条代码线,许多种选择
  9. retrofit2使用详解_秒懂Retrofit2之Converter
  10. linux中mysql与eclipse_Linux下eclipse CDT及mysql安装,c++访问mysql数据库
  11. 【HDU - 1527】【POJ - 1067】取石子游戏 (威佐夫博弈)
  12. 2019交大计算机考研分数线,上海交大2019考研计算机软件与理论的复式分数..._考研_帮考网...
  13. 服务器遭受***后的处理过程
  14. jquery使用 validate 插件进行验证是否通过
  15. bmi计算器公式_bmi计算公式
  16. C语言——百钱百鸡问题分析(最优解法)
  17. Android-PickerView系列之封装篇(三)
  18. 很励志的故事(尸山代码)
  19. Platt SMO算法
  20. android 地图相册,时光地图相册app下载-时光地图相册下载v1.0.2 安卓版-西西软件下载...

热门文章

  1. Unity 开发中常见问题 Unity bug reporter
  2. 【入门AUTOSAR网络管理测试】BSM-RMS状态转换
  3. 电脑自动录屏软件哪个好用 电脑自动录屏怎么设置
  4. (SGC强制最低128位加密,公钥支持ECC加密算法的SSL证书)
  5. 【Anaconda3】更新conda的方法
  6. 精确PSRR测量方法
  7. 基于连通域标记的点云树木分离(点云聚类)
  8. linux中 ls-ltr
  9. 什么?JPA狗用了都摇头??
  10. linux下进程的模式和类型如何,Linux——基础概念和命令