职场面试题总结(08)---MySQL索引类型、聚簇索引与非聚簇索引、MySQL数据如何存储到磁盘

104 阅读4分钟

1、MySQL索引类型

物理存储角度 (1)聚集索引(clustered index) (2)非聚集索引(non-clustered index)

逻辑角度 (1)主键索引:主键索引是一种特殊的唯一索引,不允许有空值 (2)普通索引或者单列索引 (3)多列索引(复合索引):复合索引指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用复合索引时遵循最左前缀集合 (4)唯一索引或者非唯一索引 (5)空间索引:空间索引是对空间数据类型的字段建立的索引,MYSQL中的空间数据类型有4种,分别是GEOMETRY、POINT、LINESTRING、POLYGON。MYSQL使用SPATIAL关键字进行扩展,使得能够用于创建正规索引类型的语法创建空间索引。创建空间索引的列,必须将其声明为NOT NULL,空间索引只能在存储引擎为MYISAM的表中创建。

全值匹配我最爱,最左前缀要遵守; 带头大哥不能死,中间兄弟不能断; 索引列上少计算,范围之后全失效; LIKE百分写最右,覆盖索引不写星; 不等空值还有or,索引失效要少用。 解释说明: 全值匹配:全值匹配指的是和索引中的所有列进行匹配。 匹配最左前缀:在有多列索引的情况下,只使用索引的第一列。 匹配列前缀:可以只匹配某一列的值的开头部分。例如某个字符串以某个字母开头。 匹配范围值:在有多列索引的情况下,只使用索引的第一列匹配一定范围内的值。 精确匹配某一列并范围匹配另外一列:例如在某个多列索引表中,第一列全匹配,第二列范围匹配。 只访问索引的查询:即查询只需要访问索引,而无须访问数据行

2、聚簇索引与非聚簇索引的B+树有什么区别?

聚簇索引的叶子节点中保存着数据,InnoDB就是用聚簇索引的。 在聚簇索引的二级索引中,叶子节点保存着主键,所以在二级索引中查找时,先找到二级索引中的主键,在根据这个主键,从聚簇索引中找到该主键的数据,所以需要两次查找。

非聚簇索引就是说,叶子节点只是存着数据的地址,而不是数据本身。索引文件和数据文件两个文件是分开的。MyISAM就是采用非聚簇索引。 查找时,从上到下找到叶子节点,叶子节点保存着数据的地址,拿到这个地址后,就可以直接到磁盘中找了。

3、建立一个主键索引,一个复合索引有几颗B+树?

两颗B+树。

为什么B+树比B树更适合做索引?  B树也是多叉树结构,一种自平衡的树,而且B+树是从B树演化而来的,那么为什么不使用B+树的前身B树呢?从结构比较来看,B树相比B+树的一个主要区别就在于B树的分支节点上存储着数据,而B+树的分支节点只是叶子节点的索引而已。根据这个差别可以得出以下结论: (1)磁盘IO读写次数相比B树降低了   在B+树中,其非叶子的内部节点都变成了key值,因此其内部节点相对B 树更小。如果把所有同一内部节点的key存放在同一盘块中,那么盘块所能容纳的key数量也越多。一次性读内存中的需要查找的key值也就越多。相对来说IO读写次数也就降低了。 (2)每次查询的时间复杂度是固定的   在B+树中,由于分支节点只是叶子节点的索引,所以对于任意关键字的查找都必须从根节点走到分支节点,所有关键字查询路径长度相同,每次查询的时间复杂度是固定的。但是在B树中,其分支节点上也保存有数据,对于每一个数据的查询所走的路径长度是不一样的,所以查询效率也不一样。 (3)遍历效率更高   由于B+树的数据都存储在叶子节点上,分支节点均为索引,方便扫库,只需扫一遍叶子即可。但是B树在分支节点上都保存着数据,要找到具体的顺序数据,需要执行一次中序遍历来查找。所以B+树更加适合范围查询的情况,在解决磁盘IO性能的同时解决了B树元素遍历效率低下的问题。

4、MySQL数据如何存储到磁盘?

https://my.oschina.net/u/1859679/blog/1581379