B-Tree作为索引能够提高查询效率的原理

要说明这个原理,首先要知道局部性原理:当一个数据被用到时,其附近的数据也通常会马上被使用。程序运行期间所需要的数据通常比较集中。

有了局部性原理,操作系统磁盘的访问方式就改变了,访问数据的时候不是一个字节一个字节地读出来,而是一次读出一个页(一般为4k或8k)的数据,这些数据是物理相邻的,这就是由局部性原理引申出的磁盘预读。

B-Tree作为索引(mysql在实现上实际是B+-Tree)能够提高查询效率主要有两点:

1、 B-Tree是多路搜索树,查询B-Tree中任意一个节点,最多需要访问h个节点(h为树高),无疑比遍历全表找到所需数据效率要高。

2、我们都知道IO操作是非常耗时的,而因为数据的庞大,数据库中数据都是以文件的形式存储的(如果是innoDB的存储引擎则要读数据文件,如果是myISAM只读索引文件),如果每访问一个节点中的一个数据就进行一次IO,损耗将非常大,而mysql巧妙地将一个节点的大小设置了一页的大小(利用磁盘预读的特点),每次磁盘读取一页的数据就能在一次 IO 的情况下将整个节点的数据读出来。

此外,mysql建立的B-Tree高度一般不超过3,因为100阶的高度为3的B-Tree,可以存100*100*100=10^6数据,所以基本上3次 IO 就可以完成索引。

为什么不能采用红黑树作为索引结构呢?
因为红黑树是二叉树,存储大量数据的时候树的高度会非常大,会造成多次 IO 读取,性能很差,因此红黑树不适合作为外存索引。

你可能感兴趣的:(数据库)