Tag Archives | database

B树在数据库索引中的应用剖析(发表版本)

最近一篇发表于《程序员》2014年6月刊上的文章。有点遗憾发现,有些部分被编辑修改过了,读起来有点怪怪的。最典型的是习惯于对某些比较经典的定义引用wikipedia或者原始白皮书中原始的E文,在文中发现都被硬译过了,表达的意思自己都有点看不懂了!

最终修改后提交的版本归档下:

引言

关于数据库索引,随便Google一个Oracle indexMysql index总能得到“某某索引之n条经典建议”之类大量结果。笔者认为,较之直接借鉴,在搞清实际需求的基础上,对备选方案的原理尽可能深入全面的了解会更有利于我们的决策。因为某种方案或者技术呈现出某种优势(包括可能没有被介绍到但一定存在的限制),不是厂商的白皮书这样规定,是由实现机制决定的或者说本身的结构决定的。

本文重点介绍数据结构中经典的树(B树)结构在数据库索引中的经典应用,也会涉及到几种数据库中对此支持的细微不同,以期比较完整的[......]

阅读全文

Tags: , , ,

Comments { 0 }

B树在数据库索引中的应用剖析(原稿)

引言

关于数据库索引,随便Google一个Oracle indexMysql index总有大量的结果出来,其中不乏某某索引之n条经典建议。笔者认为,较之借鉴,在搞清楚了自己的需求的基础上,对备选方案的原理有个尽可能深入全面的了解会更有利于我们的选择和决策。因为某种方案或者技术呈现出某种优势(包括可能没有被介绍到但一定存在的限制),不是定义出来的,而是因为其实现机制决定的。就像LinkedList和ArrayList分别适用于什么应用不是Document里面定义的,是由其本身的结构决定的。数据库的索引也是一样,不是厂商的白皮书这样规定,而是其原理决定的。

本文只是重点介绍数据结构中经典的树(B树)结构在数据库索引中的经典应用,也会涉及到几种数据库中对此支持的细微不同,以期比较完整的描述实现原理。最终会发现这几种被不同数据库厂商冠以不同名字东西原理上其实差不多,理论上其实是一个东西。文[......]

阅读全文

Tags: , , , , , , ,

Comments { 1 }

【译】数据库事务隔离级别

看到wikipedia中文关于数据库相关的几个经典条目有点老旧,尤其和英文条目相比。确定开始翻译其中几篇,先从事务隔离等级开始。格式采用维基Sandbox发布后的格式。翻译完后自己校对过几遍,质量还可以。:-)

已经在中文维基发布。

翻译的中文条目地址:事务隔离等级

对应的英文条目地址:Isolation (database systems)

欢迎大家指正,可以直接在维基上对应条目更新的!。

有些郁闷在英文的个人主页下面,里面的引用词条的链接都很正常但是维基中文发布后,里面的引用词条都不可用了。初步判断是中文词条和英文词条不是一个库。为了内部词条链接可用,转到博客的是我的英文的个人主页内的格式。

事务隔离(isolation)定义了数据库系统中一个操作产生的影响什么时候以哪种方式可以对其他并发操作可见。隔离是事务ACID (原子性、一致性性、隔离性、持久性)四大属性中的一个重要属性。

 

并发控制(Concurrency control)

并发控制描述了数据库处理隔离以保证数据正确性的机制。为了保证并行事务执行的准确执行数据库和存储引擎在设计的时候着重强调了这一点。典型的事务相关机制限制数据的访问顺序(执行调度)以满足可序列化可恢复性。限制数据访问意味着降低了执行的性能,并发控制机制就是要保证在满足这些限制的前提下提供尽可能高的性能。经常在不损害正确性的情况下,为了达到更好的性能,可序列化的的要求会减低一些,但是为了避免数据一致性的破坏,可恢复性必须保证。

两阶段锁是关系数据库中最常见的提供了可序列化可恢复性的并发控制机制,为了访问一个数据库对象,事务首先要获得这个对象的 。对于不同的访问类型(如对对象的读写操作)和锁的类型,如果另外一个事务正持有这个对象的锁,获得锁的过程会被阻塞或者延迟。

隔离级别(Isolation levels)

数据库事务的ACID四个属性中,隔离性是一个最常放松的一个。为了获取更高的隔离等级,数据库系统的 机制或者多版本并发控制机制都会影响并发应用软件也需要额外的逻辑来使其正常工作。

很多DBMS定义了不同的“事务隔离等级”来控制锁的程度。在很多数据库系统中,多数的数据库事务都避免高等级的隔离等级(如可序列化)从而减少对系统的锁定开销。程序员需要小心的分析数据库访问部分的代码来保证隔离级别的降低不会造成难以发现的代码bug。相反的,更高的隔离级别会增加死锁发生的几率,同样需要编程过程中去避免。

ANSI/ISO SQL定义的标准隔离级别如下。
[......]

阅读全文

Tags: ,

Comments { 0 }

【Hbase代码笔记】Put

记录HBase 进行一个Put的过程。

1. Client端通过HTable发起Put操作

2. Htable的flushCommits方法使用服务端的连接 来处理提交。和Hadoop Cilent的提交是完全一样的思路

Htable在通过自身的writeBuffer缓存后,会刷新提交

3. Htable 通过HConnection(其实是TableServers类型) 类型的connection发起提交。在Hbase构造时候

4. TableServers类的processBatchOfRows

5[......]

阅读全文

Tags: , , ,

Comments { 0 }