MySql索引 | 什么是索引呢?索引是什么样子的?( 二 )


你可以想象一下一棵100万节点的平衡二叉树,树高20 。一次查询可能需要访问20个数据块 。在机械硬盘时代,从磁盘随机读一个数据块需要10 ms左右的寻址时间 。也就是说,对于一个100万行的表,如果使用二叉树来存储,单独访问一个行可能需要20个10 ms的时间,这个查询可真够慢的 。
为了让查询过程尽量少的读磁盘,就必须让查询过程访问尽量少的数据块 。那么,我们就不应该使用二叉树,而是要使用“N叉”树 。这里,“N叉”树中的“N”取决于数据块的大小 。
以InnoDB的一个整数字段索引为例,这个N差不多是1200 。这棵树高是4的时候,就可以存1200的3次方个值,这已经17亿了 。考虑到树根的数据块总是在内存中的,一个10亿行的表上一个整数字段的索引,查找一个值最多只需要访问3次磁盘 。其实,树的第二层也有很大概率在内存中,那么平均访问磁盘的次数就更少了 。
N叉树由于在读写上的性能优点,以及适配磁盘的访问模式,已经被广泛应用在数据库引擎中了 。
不管是哈希还是有序数组,或者N叉树,它们都是不断迭代、不断优化的产物或者解决方案 。数据库技术发展到今天,跳表、LSM树等数据结构也被用于引擎设计中,这里我就不再一一展开了 。
你心里要有个概念,数据库底层存储的核心就是基于这些数据模型的 。每碰到一个新数据库,我们需要先关注它的数据模型,这样才能从理论上分析出这个数据库的适用场景 。
截止到这里,我用了半篇文章的篇幅和你介绍了不同的数据结构,以及它们的适用场景,你可能会觉得有些枯燥 。但是,我建议你还是要多花一些时间来理解这部分内容,毕竟这是数据库处理数据的核心概念之一,在分析问题的时候会经常用到 。当你理解了索引的模型后,就会发现在分析问题的时候会有一个更清晰的视角,体会到引擎设计的精妙之处 。
MySQL中,索引是在存储引擎层实现的,索引分为主键索引(key)、全文索引(FULLTEXT)、普通索引(NORMAL)、空间索引(SPATIAL)、唯一索引(UNIQUE),具体详解在下一篇介绍 。




推荐阅读