1.为什么生产环境中B+树的高度总是3-4层?
答案:一个高度为 3 的 B+ 树大概可以存放 1170 × 1170 × 16 = 21902400 行数据,已经是千万级别的数据量了,前提是每条数据只有1KB大小。 解释: 在计算机中磁盘存储数据最小单元是扇区,一个扇区的大小是 512 字节,而文件系统的最小单元是块,一个块的大小是 4k,而对于我们的 InnoDB 存储引擎也有自己的最小储存单元——页(Page),一个页的大小是 16K。 那么,InnoDB的一页,可以存放多少条数据呢?假设一条数据大小1KB,那么一个InnoDB的页可以存放16条数据; Mysql中?个 Innodb?就是?个B+树节点。 假设主键 ID 为 bigint 类型,占8字节,而指针大小在 InnoDB 源码中设置为 6 字节,这样一共 14 字节,我们一个页中能存放多少这样的单元,其实就代表有多少指针,即 16384/14=1170。 一个高为3的B+树,其第一层,只能存放1170个指针;其前两层,可以存放11701170个指针;前两层有11701170个指针,可以指向1170*1170个dataNode,一个dataNode能放16条数据,所以这一棵树能存放1170 × 1170 × 16 = 21902400条数据,即2千多万条。
2.为什么要使用自增ID作为主键?
对InnoDB来说,主键索引是聚簇索引,既存储索引值,又在叶子节点中存储行的数据。如果主键自增,那么每次插入一条数据都会在当前索引的后续位置,当这一页达到装载因子时,InnoDB会开启新的一页。而如果主键非自增,无规律可循,那可以认为它是随机的,这样一来,完全随机的插入数据会导致大量的B+树分裂和旋转,以及产生大量的空间碎片,浪费空间。
3.为什么使用数据索引能提高效率?
数据索引的存储是有序的。有序的数据结构的查找,可以用到二分的思想,其时间复杂度趋近于 log2(N)。
4.B+树索引和哈希索引的区别?
1.其底层依赖的数据结构不同,B+树索引是多叉平衡树,根据索引值的大小进行有序的存储;哈希索引是类似于哈希表的结构,其值的存放是无序的; 2.对于单个值的查询,哈希索引的复杂度为O(1);而B+树的时间复杂度为log(2)(m)*log(m)(n) = log(2)(n),用到了对数的换底公式; 3.哈希索引不支持范围查询; 4.哈希索引适用于大量等值查询的情况,而B+树索引适用于大多数情况。
5.B+树与B树的区别?
B树的每个节点存储了key和data。而B+树改进了B树, 让非叶子节点只存放key, 去掉了其中指向data的指针, 使得每个结点中能够存放更多的key, 因此能有更大的出度. 这样就意味着B+树的层高能进一步被压缩, 使得检索的时间更短。 由于底部的叶子结点是链表形式, 因此也可以实现更方便的顺序遍历。
6.MySQL的联合索引?
联合索引是两个或更多个列上的索引。 假设有一个联合索引index(a,b,c),在索引建立的时候,是按照“如果a不相等,就按照a排序;否则,如果b不相等,就按照b排序,否则,就按照c排序”,因此,建立好的索引在全局上看,只有a是有序的,而b和c在全局上看都是无序的,只有a相同的时候,b才有序;a,b都有序的时候,c才有序。 注意:
下面几个会走索引 select * from test where a = ‘333’ and b = ‘333’ and c = ‘333’; select * from test where b = ‘333’ and a = ‘333’ and c = ‘333’; select * from test where c = ‘333’ and b = ‘333’ and a = ‘333’; select * from test where a = ‘333’ and c = ‘333’;
而不遵循最左前缀原则的,就不会走索引。如:
select * from test where b = ‘333’ and c = ‘333’;
|