Mysql BTree深入了解
背景
在了解完数据库的BTree后,在看某篇博客的时候被里面的几个问题吸引了,博客里也有问题的解答,感觉挺有意思的,因此做下记录以及自己个人的理解
参考资料:数据库索引类型及其原理
数据表为什么会使用主键?
事实上在Mysql中每个表都会有主键,如果你不设置,则会有隐藏的自增主键Rowid,那么主键的作用是为了让表生成聚集索引,该索引以BTree的结构存放
那么什么是聚集索引呢?
其实就是正常的BTree结构,而他的叶子节点存放的都是实际的data。
有了聚集索引也会有非聚集索引,那非聚集索引则是叶子节点存放的不是data而是指向对应data的指针。而非聚集索引通常是由一版索引、唯一索引、全文索引创建的
非聚集索引有以下特点:
- 一个表可以有多个非聚集索引(最多249个)
- 非聚集索引必须在聚集索引创建之后创建
- 在叶子节点存储的是指向对应data的指针
为什么使用索引后查询效率会变快?
假如我们表有100w条数据,如果不使用索引的话,需要全表扫描,会检索100w次,那么就会花费大量时间。
如果使用索引,打个比方,select id from table_name where id = 234;
这个sql会使用主键索引,在根节点上会判断234在那个区间里,然后持续深入去查找,直到对应数据,那么这个查找的次数等于BTree的深度,因此他查找的次数可能就几次,那么所花费的时间当然就少了。因此利用索引在查询的效率上有质的提升
使用索引后会使插入、修改、删除变慢?
每使用一个索引,都会将数据整体复制一遍形成非聚集索引而存储下来,每次删除,修改,新增的时候都需要对所有索引结构进行梳理来确保他的正确性,者会带来不小的开销,这也是变慢的原因
什么时候需要在两个字段上加索引?
首先,给表中多个字段加上索引,那么就会出现多个独立的索引结构,每个索引互相之间不存在关联.
每次给字段建立新索引时,字段中的数据就会被复制一份出来,用于生成索引。因此,给表添加索引,会增加表的体积,占用磁盘存储空间。
非聚集索引和聚集索引的区别在于,通过聚集索引可以查到需要的数据,而通过非聚集索引可以查到记录对应的主键值,再使用主键值通过聚集索引查到需要的数据。
因此不管以何种方式查询表,最终都会利用主键通过聚集索引来定位数据,也就是说聚集索引(主键)是通往真实数据所在的唯一路径
但有一种列外不需要使用聚集索引就能查询出所需要的数据,这种称为【覆盖索引】查询,也就是所说的复合索引或者多列字段索引查询。
如果一个索引指定两个字段,那么这两个数字段的内容都会被同步至索引之中。
因此在查询时找到对应的非聚集索引里的叶节点内容会出现两个字段的值,因此通过这种方式查找,可以省略后面的两个步骤(找到对应数据的主键、通过主键查询聚集索引中的数据),大大的提高了查询性能。