索引
索引是帮助Mysql高效的获得数据的排好序的数据结构
数据库表内数据相邻,数据是存在磁盘文件上,在磁盘文件上不一定就是挨着的,每次查询都是去磁盘上拿IO交互 io交互是耗费性能的
索引数据结构
目前在Mysql的使用的数据结构有B+树和Hash
B+树(B+ Tree)
- 非叶子节点不存储data数据 只存储冗余索引,可以放更多的索引
- b+树的叶子节点两边都存放着相邻节点的磁盘文件地址 这就实现了双向指针 提高区间访问性能
(为了很好的支持 范围查找和全表扫描,不用查一个节点后再返回根节点继续查,直接顺藤摸瓜的拿出数据) - 叶子节点包含了所有的索引字段
- 把叶子节点内每个节点的最小值当前上一个的冗余索引
利用折半查找数据速度非常快
叶子节点的data内存储的是什么数据要看是什么索引
聚集索引:叶子节点存储的是当前索引所在行其他所有行的数据
非聚簇索引:叶子节点存储的是当前索引所在行其他行在.MYD文件内的磁盘文件地址
这是主键索引,二级索引存储的是主键值
Hash
hash是把索引的哈希值算出来后放到hash桶内,把索引所在行的磁盘文件地址放到一起
查找数据也是一样,把查询出的数据算出hash值后去对应的桶内去拿数据
缺点:hash碰撞,如果多个索引的hash值是一样的就会放到一个hash桶内就会造成hash冲突
只能实现 = in 等操作 不能实现范围查找,相邻的索引的hash值不一定是相邻的,可能会放到隔着很远的hash桶内,这样就没办法范围的查找,只能全表扫描,这样就不走索引
联合索引
最左前缀原理
- 联合索引会按照最左前缀原理(最左列原理)来生成一个B+树
- 索引就是一个排好序的数据结构 联合索引也是一个排好序的数据结构
- 在联合索引内 最左边的索引字段 是拍好顺序的 ,在第一个相同的情况下 第二个索引是排好序的,
- 全局来看除了最左列的索引是排好序的别的都不是排好序的,别的索引都是在左边索引相同的情况下是排好序的
- 索引的原则就是拍好顺序的数据 ,如果查找数据不按照索引依次查找是不走索引的 ,因为对他们来说这个索引不是拍好顺序的
如果不跳过某个联合索引中的某一个字段用的话都是会走索引的