常见问题
1.如果业务满足某字段唯一,是否可以考虑用该字段作为主键?
例如居民身份证号可以保证唯一,那么是否用身份证号当做主键建表?这里并太建议,根据上面介绍的聚簇索引和二级索引的结构之后,可以看出主键索引越长对于辅助索引建立需要更多的空间,另外对于聚簇索引,如果索引过长会导致主键索引树的高度变高,因为一个数据页默认是16k,主键索引越长则一个数据页能容纳的索引则越少。身份证号是18位,用字符串来存需要18个字节,而如果使用自增的long来做主键,则只有8个字节。另一个好处就是自增主键可以保证插入只需要插入到数据页的队尾,不需要插入中间,而身份证号按照顺序排序有可能会插入中间位置,这样会导致数据页存满,数据页分裂等消耗。
2.为什么使用 B+树 而不使用二叉树或者B树?
首先,我们知道访问磁盘需要访问到指定块中,而访问指定块是需要 盘片旋转 和 磁臂移动 的,这是一个比较耗时的过程,如果增加树高那么就意味着你需要进行更多次的磁盘访问,所以会采用n叉树。而使用B+树是因为如果使用B树在进行一个范围查找的时候每次都会进行重新检索,而在B+树中可以充分利用叶子结点的链表。
B-Tree中无论中间节点还是叶子节点都带有卫星数据。而B+Tree只有叶子节点带有卫星数据,中间节点只带有索引。
B-Tree的结构和B+Tree结构类似,只是非叶子节点也会存储数据,而B+Tree只在叶子节点存储数据,虽然B-Tree可能在遍历到第二层时就可以得到数据返回,但是由于非叶子节点也会存储数据,导致每个数据页存储的索引更少,导致树的高度会很高,如果需要遍历的数据在叶子节点,则非常费时,所以查询性能不如B+Tree稳定。MySQL,InnoDB引擎一个数据页大小为16KB,所以从理论上讲,一个数据页存储的有用信息越多,树的高度就会越低,I/O次数越少,搜索效率越高。