1.聚簇索引和非聚簇索引的区别?
聚簇索引是在叶子节点中存的是索引和所有的数据
非聚簇索引在叶子节点中存的是索引和主键索引的ID
2.为什么非主键索引存的是主键值而不是数据?
时间换取空间,假如说数据库中的数据非常多的话,主键索引和非主键索引的叶子结点都存所有的数据的话会占用大量的空间
数据一致性的问题,假如非主键索引存的是数据的话,更改了主键索引中数据的值,那么也要更改非主键索引的值
3.为什么推荐整型自增主键?
在构建索引树的过程中,有一个比较大小的过程,整型自增主键比较时时间复杂度低,相比来说,使用字符串的比较时间复杂度相对较高
使用整型自增主键的时候主键是连续自增的,在索引树中插入的时候按顺序插入就行,而使用字符串作为索引的时候,
插入时候的数据的索引有可能不是连续的,这时候有可能要进行索引的重建,索引的维护成本高
4.innoDB怎么保证必有主键?
如果某个表没有设置主键的话,mysql会找一个unique列作为主键,如果unique的列不存在的话,就生成一个默认的主键,只不过这个主键在表中不显示
5.B TREE
度:节点的数据存储个数
叶节点具有相同的深度
节点中的数据可以从左到右递增排列
数据存在树的所有节点中
6 B+ TREE
数据只存在叶子结点中,非叶子节点只存key,可以增大度
所有叶子节点都有一个链指针
顺序访问指针,提高区间访问的性能(方便进行范围查询)
7.MySQL的索引为什么不用hash?
无法完成范围查询
无法进行模糊查询
不支持多列联合索引
因为哈希碰撞问题,索引效率低