爱豆吧!

idouba@beta.

从Search Sort到Join

发表于《程序员》2015年4月B的一篇文章,在博客归档下。根据杂志社要求,在自己博客发表该文章亦须注明:本文为CSDN编译整理,未经允许不得转载,如需转载请联系market#csdn.net(#换成@) 想通过原理来说明一些技术白皮书上“什么时候应该使用什么”这个“应该”后面的原因。通过数据结构中经典的排序查找算法来推倒解释数据库中几种经典的表连接背后的算法原理,和原理决定的在各种数据库中不同的应用和限制。以简单的算法来讲出数据库系统中看着核心强大功能的本质的算法设计。较之白皮书中不同数据库的不同 Read more →

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

最近一篇发表于《程序员》2014年6月刊上的文章。有点遗憾发现,有些部分被编辑修改过了,读起来有点怪怪的。最典型的是习惯于对某些比较经典的定义引用wikipedia或者原始白皮书中原始的E文,在文中发现都被硬译过了,表达的意思自己都有点看不懂了! 最终修改后提交的版本归档下: 引言 关于数据库索引,随便Google一个Oracle index,Mysql index总能得到“某某索引之n条经典建议”之类大量结果。笔者认为,较之直接借鉴,在搞清实际需求的基础上,对备选方案的原理尽可能深入全面的了解会更有利于 Read more →

从Count看Oracle执行计划的选择

一、 前言 在调查一个性能问题的时候,一个同事问道,为什么数据库有些时候这么不聪明,明明表上有索引,但是在执行一个简单的count的时候居然全表扫描了!难道不知道走索引更快么? 试图从最简单的count来重新了解oracle查询计划的选择,以及最终产生的结果。虽然有些结果会让人觉得有些意外,并且可能会鄙视,这个查询计划选择真的不够聪明。但稍微用心点的去了解,做的已经足够细致了。大多数情况下,根据我们输入的信息,来自输入的SQL、表结构、索引状况、统计信息,会得出一个比较优的计划。所以和前面一直试图讲到 Read more →

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

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

Oracle索引原理精简总结

结合使用整理Oracle的索引,主要权威的来自于Oracle Database Concepts与Oracle Database Performance Tuning Guide 尝试用最少的字数介绍oracle的几种常用索引原理,主要是想简单分析其存储结构来说明其检索方式,和解释为什们某种索引使用与某种场合。(数据结构中最简单的ArrayList和LinkedList的使用场景)。阐述原因只有一个,就是因为其存储结构决定的。 B树索引(默认类型) 存储结构: B+树,不多描述。和其他几种关系数据库一样,就是根据索引列(一个或多个)来构造一个B+树来存储索引。非叶子节点两个区域: Read more →

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

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

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

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

1 并发控制(Concurrency control) 2 隔离级别(Isolation levels) 2.1 可序列化(Serializable) 2.2 可重复读(Repeatable reads) 2.3 授权读(Read committed) 2.4 未授权读(Read uncommitted) 3 默认隔离级别 4 读现象(Read phenomena) 4.1 脏读(Dirty reads (Uncommitted Dependency)) 4.2 不可重复读(non-repeatable read) 4.3 幻影读(phantom read) 5 隔离级别、读现象和锁(Isolation Levels, Read Phenomena and Locks) 5.1 隔离级别vs读现象(Isolation Levels vs Read Phenomena) 5.2 隔离级别vs 锁持续时间(Isolation Levels vs Lock Duration) 6 参照 7 相关条目 8 外部链接

并发控制(Concurrency control)

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

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

隔离级别(Isolation levels)

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

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

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

Read more →