本文讨论MySQL支持的索引类型及其优缺点。要注意的是:在MySQL中,索引是在存储引擎层而不是服务器层实现,所以不同存储引擎的索引的工作方式并不一样,也不是所有的存储引擎都支持所有类型的索引。
B+树索引
B+树是一种经典的数据结构,由平衡树和二叉查找树结合产生,它是为磁盘或其它直接存取辅助设备而设计的一种平衡查找树,在B+树中,所有的记录节点都是按键值大小顺序存放在同一层的叶节点中,叶节点间用指针相连,构成双向循环链表,非叶节点(根节点、枝节点)只存放键值,不存放实际数据。下面看一个2层B+树的例子:
保持树平衡主要是为了提高查询性能,但为了维护树的平衡,成本也是巨大的,当有数据插入或删除时,需采用拆分节点、左旋、右旋等方法。B+树因为其高扇出性,所以具有高平衡性,通常其高度都在2~3层,查询时可以有效减少IO次数。
对于B+树复合索引来说,索引列的顺序非常重要,如果不是按照索引的最左列开始查找,则无法使用索引,也不能跳过索引中的列。下面是一个复合索引的例子:
alter table t add key idx_a_b(a,b);下图是它的结构图:
很显然,对于where a = xxx and b=xxx 这样的语句是可以使用这个复合索引的。现在看看对单个列的情况,where a = xxx也是可以使用该复合索引,因为a列在复合索引中也是有序的,但对于where b =xxx 这样的语句是无法使用该复合索引,因为它是无序的。