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”;
3,MySQL底层索引算法支持B+Trees和hash两种方式
Hash的效率比B树高,为什么不用hash,因为hash不支持范围查找,只适用于=,如<,>hash就没用了,所以大部分情况下都是用B树而不用hash;
B树叶子之间有维护指针,适用于范围查找。
4,Myisam和Innodb的底层区别:
Myisam叶子结点存储的是索引和数据地址,具体数据在另外一个文件;
Innodb叶子结点存储的是索引和具体的行数据,索引和数据在同一个文件;
从这个层面看,innodb比myisam少了一次数据的查找,效率要高;
聚集索引:叶子结点包含了完整的数据记录
非聚集索引:索引文件和数据是分开存储的
问题1:为什么Innodb必须有主键,并且建议为整型?
因为innodb要求必须有主键来维护btree的数据结构,即使我们不建,默认也会自动建一个,我们看不到而已,至于要用整型,是因为,在btree比较大小的时候整型效率比较高,并且占用的空间也比较小,至于自增,不是自增会导致节点分裂,数据存储调整,效率很低,如果是自增,数据只是往后面加,效率就非常高