1.主键索引数据结构:Hash和B+树;
hash参考java中的HashMap没啥好说的,主要讲讲B+树(B+树建议先看看二叉树,红黑二叉树,B树)
红黑树:红黑树的特性保证了树的平衡性;
B树:是指每个树节点可以存储不止一条数据,比如一次磁盘寻道IO可以读取16KB数据时,一个节点理论上可以存储16KB的数据,一条数据为16B时,一个节点可以存储1024条数据,这样就限制了B树的高。每层树可以有1000条数据时,三层树就可以保存10亿条数据。(树的查询,每次可以查询一层数据,所以树的高度越低,查询越快.)
B+树:改动点在于,非叶子节点不保存具体数据 只保存主键值,所有的数据都保存在叶子节点。这样的话在查询范围数据时,就不用每次都用根节点去查询了,节省了IO次数。
2.非主键索引:与主键索引不同点在于,所有的叶子节点存储具体数据的地方存储的是主键索引的值,所以通过非主键索引查询数据时,最终还是依靠非主键索引找到主键索引,然后找到对应数据。这样是用IO(时间)换空间(所有数据只存一份)。
3.InnoDb(聚集索引):是因为主键索引字段与具体的数据存储在一起(都在叶子节点 磁盘上)。(InnoDb支持事务,MyISAM不支持)
4.MyISAM(非聚集索引):是因为主键索引的叶子节点上存储的是具体数据的磁盘地址,而非具体数据。
5.联合索引:最左匹配,顺序会优化。
面试题一:为什么优先使用自增索引:
1.整型数据占用字节大小比字符串小,一个节点能存储的主键字段个数多,度比较大,树高比较小;
2.自增主键插入是有序的,字符串主键UUID是无序的,有序的插入能减少B+树索引重建时的分裂和数据移动。
面试题二:为什么非主键索引的叶子节点存储的是主键值,而非索引:
1.IO(时间)换空间(所有数据只存一份)。
暂时先到这,下次继续~~