索引
索引是什么
Mysql官方对索引的定义为:索引(Index)是帮助Mysql高效获取数据的数据结构。可以得到索引的本质:索引是数据结构。
平时看任何一本书,首先看到的都是目录,通过目录去查询书籍里面的内容会非常的迅速。
生活中的索引
上图就是一本金瓶梅的书,书籍的目录是按顺序放置的,有第一节、第二节他本身就是一种顺序存放的数据结构,是一种顺序结构。
另外通过目录(索引),可以快速查询到目录里面的内容,他能高效获取数据,通过这个简单的案例可以理解就是高效获取数据的数据结构。
再看一个复杂的情况:
我们要去图书馆找一本书,这图书馆的书肯定不是线性存放的,他对不同的书籍内容进行了分类存放,整个索引是由一个个节点组成,根节点有中间节点,中间节点下面又有子节点,最后一层是叶子节点。
可见,整个索引结构是一颗倒挂的树,其实他就是一种数据结构,这种数据结构比前面的线性目录更好的增加了查询速度。
Mysql中的索引
Mysql中的索引其实也是这么一回事,我们可以在数据库中建立一系列的索引,比如创建主键的时候默认创建主键索引,上图是一种BTREE的索引。每一个节点都是主键的id,当我们通过Id来查询内容的时候,首先去查询索引库,在到索引库后能快速定位索引的具体位置。
为啥不用HashMap做索引?
B+Tree
B+ TREE 还是TREE。
二分查找
二分查找法(binary search)也称为折半查找法,用来查找一组有序的记录数组中的某一记录。
其基本思想是:将记录按有序化(递增或者递减)排序,在查找过程中采用跳跃方式查找。即先以有序数列的中点位置作为比较对象,如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分。通过一次比较,将查找区间缩小一半。
示例代码:
在这里插入代码片
二叉树
每个节点至多只有二棵子树:
1、 二叉树的子树有左右之分,次序不能颠倒
2、 一棵深度为k,且有2^k-1个节点,称为满二叉树(full Tree)
3、 一棵深度为k,且root到k-1层的节点树都达到最大,第k层的所有节点都连续集中在最左边,此时为完全二叉树(complete tree)
将有序数组转换成二叉树
平衡二叉树
1、 左子树和右子树都是平衡二叉树
2、 左子树和右子树的高度差绝对值不超过1
平衡二叉树的遍历
前序:6 ,3, 2, 5,7, 8(ROOT 节点在开头, 中 -左-右 顺序)
中序:2, 3, 5, 6,7, 8(中序遍历即为升序,左- 中 -右 顺序)
后序:2, 5, 3, 8,7, 6 (ROOT 节点在结尾,左-右- 中 顺序)
平衡二叉树的旋转
B+树
B+树的定义
1、 数据只存储在叶子节点上,非叶子节点只保存索引信息
2、 非叶子节点(索引节点)存储的只是一个flag,不保存实际数据记录
3、 索引节点只是该节点的左子树比这个flag小,而右子树大于等于这个flag
4、 叶子节点本身按照数据的升序排序进行连接(串联起来);
5、 叶子节点中的数据在物理存储上是无序的,仅仅是逻辑上有序(通过指针串在一起)
B+树的作用
在块设备上,通过B+树可以有效的存储数据。
所有记录都存储在叶子节点上,非叶子存储索引keys信息
B+树包含有非常高的扇出(fanout),通常超过100,在查找一个记录时,可以有效的减少IO操作;
B+树的扇出
该B+树高度为2
每叶子页4条记录
扇出数为5
叶子节点由小到大串联在一起
扇出:是每个索引节点指向每个叶子节点的指针
扇出数=索引节点可存储的最大关键字个数+1
图例中的索引节点最大可以存放4个关键字,但是实际上使用了3个;
B+树的插入操作
B+树的插入
B+树的插入必须保证插入后叶子节点中的记录依然排序。
1、 插入28
插入前:
插入后:
2、 插入70
插入前:
插入后:
3、 插入95
插入前:
插入后:
索引的分类
普通索引:即一个索引只包含单个列,一个表可以有多个单列索引。
唯一索引:索引列的值必须唯一,但允许有空值。
复合索引:即一个索引包含多个列。
聚簇索引(聚集索引):并不是一种单独的索引类型,而是一种数据存储方式。
基础语法
查看索引
Show index from table_name \G
创建索引
Create unique index indexName on Mytable(columname(length))
Alter table 表名 add unique index indexName On (columnname(length))
删除索引
Drop index indexName on mytable