1.聚簇索引和非聚簇索引?
聚簇索引是指数据行按照顺序存储和使用,在innodb中,主键索引被称为聚簇索引,其他索引是非聚簇索引,因为主键索引中叶子节点是完整的数据行,叶子节点之间通过双向链表连接,而非主键索引的叶子节点是主键的值,如果使用非主键索引(辅助/普通索引)的话,需要回表二次到主键索引中进行二分查找。在innodb中,如果插入数据行的顺序和主键索引的顺序不同,在当前innodb页储存满时,会发生页分裂,新插入的数据行需要按照顺序排列,导致插入的效率变低。
聚簇索引的优势:IO次数少,查询效率高;
聚簇索引的劣势:无序插入数据时会页分裂;
2. B+树的结构?
对于innodb,非聚簇索引,非叶子节点存储索引值,叶子节点存储主键值;聚簇索引,非叶子节点存储主键索引值,叶子节点存储数据行。对于myisam引擎,都是非聚簇索引,非叶子节点存储索引值,叶子节点存储数据的地址。
2. B+树的层数?
以innodb主键索引举例,索引采用B+树的数据结构,查找数据从根节点开始,一旦建立聚簇索引,根节点的地址就会记录下来;B+树的非叶子节点储存下一层的指针和主键索引的值,叶子节点存储数据行内容。
在磁盘上,储存的最小单位为扇区,大小为512字节;在操作系统中,最小单位为块,大小为4k;在innodb中,最小单位为页,大小为16K。如果数据行的平均大小为1K,一页能存储16条数据行记录(16个叶子节点)。innodb中指针大小为8字节,主键的值如果是bigint也是8字节,一页能储存 16k / (8bytes + 8bytes)约等于 1000,高度为1的B+树能存储 16条数据,高度为2的B+树能存储1000 * 16 条数据,高度为3的B+树能存储1000 * 1000 * 16 = 1600,0000数据,B+树的高度一般是2-4,可以满足千万级数据的查询,一次页的查询代表一次IO,需要2-4次IO即可。