1.索引:实际上是物理上对数据库的一列或多列的值进行排序的一种存储结构。要想了解索引,首先了解下表。
2.表:表是由段组成,段由区组成,区由页组成,页由行组成,行存放数据。
其中段由存储引擎控制,DBA无法也没必要控制。
区由连续页组成,大小为1M,一般页大小16K,即一个区64个页。为保证数据页的连续性,存储引擎每次从磁盘申请4~5个区。在独立表中,创建的默认表大小为96K,这96K并非由页组成,而是32个页大小的碎片页,这样做是为了对于一些小表,节省磁盘空间,当使用完这些碎片页后才是64个连续页。
页磁盘管理的最小单位,大小可以设置,一般16K,可设置2K,4K,8K。一旦设置完之后不能再修改。
行存放数据,一页16K/2-200行,即7992行。
3.每从磁盘读取一次数据成为一次磁盘IO,那么一次读取多少呢,这是不确定的,为了提高性能,对于数据请求,数据库会先放在缓存中,之后一次性将缓存里的所有请求合并成一个IO处理。当我们读取到数据的时候,该数据所在页也会被读取出来,这称为局部预读原理,即当一个数据被读取的时候,那么他相邻的数据也可能很快被访问到。
了解了数据读取后,我们来了解索引是怎么回事。
索引实际上是一个B+树,什么是B+树呢?
那就要从二叉树说起,我们查找某个数据的位置时,最快的方法是将这些数据排序,再从这些数据的中间开始进行对比,若小于中间值则往左边查找,反之从右边,之后也是以此类推直到找到数据位置。这种查找方法叫做二分查找法。二叉树就是基于二分查找法,二叉树可以随意构造,但是查找效率一般,于是出现了平衡二叉树,平衡二叉树必须以以中间值作为根节点,即将中间数据作为根节点提起,两边的数据分别再取中间值作为左右子节点,以此类推,形成一颗倒挂的树。
B树是一颗特别的平衡树,他属于多叉树,即一个节点允许有多个叶子节点。B+树是B树的升级版,相对于B树,B+树的非叶子节点并不保存数据,所有数据都在叶子节点。非叶子节点只保存数据指针,这样使得每个非叶子节点能存储的数据大大增大,使得这棵树的深度更加小,搜索时跟更加快。
B+树的叶子结点数据有序排列,每个数据的结尾都会保存下一个数据的指针,这样整个数据形成一个链表使得查找更快。
聚集索引:按照B+树有序排列,叶子节点存放数据。只能有一个。(因为叶子节点要存放实际数据,占有空间较大,多个的话会浪费空间得不偿失)
非聚集索引:按照B+树有序排列,叶子节点不存放数据,只存放地址。根据这个地址再从聚集索引树中查找数据,因此,非聚集索引也叫做辅助索引。可以有多个。