现在在看Mysql索引相关内容,记录下,方便以后复习
索引是什么?索引是帮助高效获取数据的数据结构。
索引也可能是一个文件
其他类型:
-hash Map
hash保存的是数据的地址,通过地址可以直接访问到,速度也是非常快的。但是mysql语句有区间查询 类似于 WHERE id>2,这样的条件查询时,hash无法定位。
-二叉树
二叉树一个一个查找,当WHERE id=1000时可能就需要执行1000次IO,这样的效率太低
-红黑树
红黑树一样会执行多次IO,效率也不高。
-B-Tree
随着Tree的深度变大,IO次数变多
-B+Tree(MySQL底层使用的是B+Tree的定制化,也就是改进版的)
不管数据有多少,基本只需要3-5次IO
MySQL默认存储引擎是InnoDB。
MySQL的数据是以文件的形式存储的,在mysql文件目录下的data文件夹下。
.frm文件存的是表结构,.myi是索引文件,.myd是数据文件
MyISAM的索引和数据是分开的,也就是两个文件.myi和.myd,索引与数据分离叫做非聚集索引。索引存的数据格式为(KEY,DATA) DATA为表中数据的地址。
InnoDB是以主键为索引来组织数据的,如果没有设置主键,会自动给我们增加一个6位数的隐藏id来创建主键树,如果设置了别的属性为索引,索引的(KEY,DATA)DATA就是主键,再通过主键去获取到数据
.ibd是数据文件和索引文件一起
InnoDB的索引和数据是在一起的,也就是.ibd文件,索引与数据在一起叫做聚集索引。索引存的数据格式为(KEY,DATA) DATA为表中的数据。
最后一个问题,为什么要用自增id作为主键?
我自己的理解,自增的id作为主键每次查找一个新的主键的时候当前B+Tree的改动比较小,直接插入到最右边,再进行小幅度变化即可。如果使用英文字母,每次插入都会插在中间,这样整个树的变化是比较大的。