梁敬彬梁敬弘兄弟出品
往期回顾
七座城堡⓵ OLTP(上)
4. 索引是提升OLTP的重要武器
老王:OK,说说索引具体是如何实现的吧。
老柯: 好的,咱们依然用仓库来举例,设法解释清楚索引如何?
老王: 好,咱们就聚焦这个需求,如何在仓库里找符合某种尺寸的货物?
老柯:嗯,前面我们提到一种思路,即让这些货物以尺寸为依据进行有序存储,这样就可快速定位到您所要的货物。不由于这种有序存储货物方式无法满足多样化需求,且有不少额外的开销,所以这样的方式我们需要谨慎使用。
老王:是啊,您提到的索引就不一样了,是建辅助数据来实现,就想听你讲讲具体怎么做呢?
老柯:咱们可以把每个货物的尺寸和位置信息记录在小卡片上,姑且把这个卡片称之为尺寸卡片。同时让每张卡片一直保持有序的排列,然后就可以了。
老王:什么,说完了,我还没反应过来就结束了?这也太快了吧。
老柯:是啊,假设您开始要找某特定尺寸的物品,首先您先去找这个尺寸卡片,由于卡片排序过了,您一下就定位到哪些卡片符合您要的物品都尺寸,同时卡片上有货物的位置信息,于是轻而易举的找到您要的物品了。同理,你要找特定价位的就找价位卡片。
老王:哦,等等,卡片上还有记录位置信息,那你是怎么知道位置信息呢?
老柯:这个简单,数据库表中每一行都有特定位置编码的,如果一定要用生活中来类比,任何物品不是都有一个空间坐标位置吗?
老王:我想想,好像是啊,就这么简单?
老柯:从索引原理上来说,就这么简单,当然了到了具体的数据库体系结构中,索引是以一种二叉树的形式存在,分为根茎叶三层节点,叶子节点存储的就是需要排序的列的值,这里就是尺寸。同时还保存了这个值对应的这一行记录的地址。说起来或许复杂一些,但是本质就是我描述的这些卡片。”
老王:我好像明白了,感觉可能很复杂的东西没想到说起来就这么简单。
老柯:技术和生活其实是相通的,没有什么技术问题是生活中解释不了的,大道至简!
5. ACID是关系型数据库基石
老柯:“老王,其实咱们这个OLTP数据库还有一个很精彩的特性我没说,即ACID特征。其中A代表原子性,C代表一致性,I代表隔离性,D代表持久性…”
“等等,老柯你说慢点,啥ACID,啥原子性?” 老王打断了老柯的话。
老柯:我正要解释啊,您别急。比如您给我转帐1元钱,我必须要收款成功,您的账户才可以扣款成功,否则您汇款成功我收款失败,那这1元钱就凭空消失了啊。这种在一个事务里要么一起成功,要么一起失败,像原子一样密不可分的特性,就是原子性。
老王:明白了,听起来很有趣。对了,一致性呢,也解释解释。
老柯:原子性关注的是事务内部的操作,确保这些操作是不可分割的,而一致性关注的是事务对数据库状态的影响,确保数据库始终保持数据完整性。这两者之间的联系在于,原子性为实现一致性提供了基础。只有当事务具有原子性时,我们才能确保数据库在事务结束后达到一致性状态。
假设您和我有A,B两账户,各1元,8点开始统计A+B总和,8点1分检索到A,8点3分检索到B,如果此时查询结束,将得出正确的A+B=1+1=2元。可惜在8点2分发生A转1元给B的操作,即A=0,B=2。此时8点3分检索到的B事实上是2元,于是得出A+B=1+2=3元,值显然错了。这就是不符合数据库的一致性,老王您说该怎么解决呢?
老王:我明白了,从查询那个时刻起,所有的值都应该不能变化了,有实际变化也要回到那个时刻的值,否则永远不会有正确的结果。
老柯:太棒了,至于数据库内部如何实现,有MVCC机制或者回滚段等多种方式,这里就不赘述了,您能把解决思路需求准确描述出来,真是厉害!此外另外两个特性,隔离性是一种保护机制隔离性主要是通过并发控制机制来实现的,如通过锁等方式来确保多个会话之间对同一数据的操作不会相互干扰,保证数据的完整性和一致性。如session1更新表的某一行(如:update t set name=‘abc’ where id=2 )再还没提交成功时,session2也在更新该表同一行记录的进程如(update t set salary=10000 where id =2 )必须等待,直至session1 提交成功。
而持久性就是数据是要永久保存的,要防止丢失。而所有的意外都可以通过日志等方式来恢复,日志要先于数据写入磁盘。这些细节我就不展开了。
老王:OLTP数据库城堡真是挺有趣的,希望给我们来更多惊喜。
“会的!” 老柯自信的回应,并与老王约定了下次城堡再聚的时间。
未完待续…
七座城堡② OLAP(上)