1,MySQL索引的底层实现是B+Trees,根节点存在内存中;

为什么不是二叉树或者红黑树,二叉树对于连续递增列没有效果,红黑树,数据量比较大的时候节点数比较多,查询效率也是比较低的

B+Trees:同一节点扩大索引的数量,但不存储数据,所有的数据都存储在叶子结点;

2,每个节点的大小大约16K,具体:16384;每个索引(bigint)占8bit,后面紧跟一个指针占6bit,总共14bit,所以根节点可以存储16k/14bit大约为1170个索引,如果为三层结构,就可以存储2千万(1170x1170x16(16k/1k每条数据占1k)=2千多万)条数据,三次IO就可以轻松解决千万级别的数据查找;

查询SQL:show global status like “Innodb_page_size”;

MySQL索引底层原理

3,MySQL底层索引算法支持B+Trees和hash两种方式

Hash的效率比B树高,为什么不用hash,因为hash不支持范围查找,只适用于=,如<,>hash就没用了,所以大部分情况下都是用B树而不用hash;

B树叶子之间有维护指针,适用于范围查找。

MySQL索引底层原理

 

4,Myisam和Innodb的底层区别:

Myisam叶子结点存储的是索引和数据地址,具体数据在另外一个文件;

Innodb叶子结点存储的是索引和具体的行数据,索引和数据在同一个文件;

从这个层面看,innodb比myisam少了一次数据的查找,效率要高;

聚集索引:叶子结点包含了完整的数据记录

MySQL索引底层原理

非聚集索引:索引文件和数据是分开存储的

MySQL索引底层原理

问题1:为什么Innodb必须有主键,并且建议为整型?

          因为innodb要求必须有主键来维护btree的数据结构,即使我们不建,默认也会自动建一个,我们看不到而已,至于要用整型,是因为,在btree比较大小的时候整型效率比较高,并且占用的空间也比较小,至于自增,不是自增会导致节点分裂,数据存储调整,效率很低,如果是自增,数据只是往后面加,效率就非常高

相关文章: