索引的本质
索引是帮助MYSQL高效获取排好序的数据的一种数据结构。
我们先看几种常用的数据结构。
1、下图是一种二叉树的存储结构。
/2、红黑树(二叉平衡树),可以解决二叉树单边增加变成链表的问题。但是红黑树如果数据变多查询IO次数也会很多,消耗也很大。
3、B - tree,相对于红黑树做了横向的拓展,那么这种数据结构能够减少IO资源的支出。提高查询速度。
4、B + tree相对于B-tree 的一种变形,这种数据结构也是目前应用在mysql的INNODB类型的索引上。这种数据结构的每个索引节点大约14B的空间(其中bigint 8B,内存地址大约6B),叶子节点1KB大小,那么一次io与内存交互是16K的话,计算每一层会有1170个节点那么叶子节点能够存放大约1170117016个数据,大约两千多万条,也就是说小于两千万多可以用索引查询到理论上来说。
5、以上说的都是非聚合索引,那么聚合索引的结构如下图:
联合索引本质:
当创建**(a,b,c)联合索引时,相当于创建了(a)单列索引**,(a,b)联合索引以及**(a,b,c)联合索引**
想要索引生效的话,只能使用 a和a,b和a,b,c三种组合;当然,我们上面测试过,a,c组合也可以,但实际上只用到了a的索引,c并没有用。
结论:尽量使用聚合索引!
Myisam这种文件存储类型是不常用的。这种类型是将索引文件和数据文件分开的。查找数据是先查找索引文件,然后根据内训地址去查找数据。