具体的sql优化和索引优化 写在这边文章中:
sql优化地址
索引主要作用:高效获取数据
那么它是如何达到高效的获取数据呢?可以先从它的数据存储结构开始说起。
主要以innoDB引擎的B+Tree 进行说明
无索引:
先说一个没有索引的数据表结构
col1 | ool2 |
---|---|
1 | 苹果 |
2 | 梨子 |
3 | 西瓜 |
4 | 香蕉 |
5 | 西红柿 |
假设该表结构没有索引进行搜索 col1 = 5
那么自然而然 先按照顺序 1 、2、3、4、5进行搜索判断,直到把所有匹配5的值找出来。
这也就是全表检索了,在数据量较大的时候,速度是非常慢的。
二叉树:
那么这里假设索引 引入一个二叉树试试看
上图就是二叉树进行的索引值存储
这个是在线模拟二叉树生成的工具
二叉树特性:
- 所有节点最多拥有两个子节点,即度不大于2
- 左子树的键值小于根的键值,右子树的键值大于根的键值
通过上图可以得出 如果需要查处col1 = 5,那么依次进行判断只需要三次 3 、4、5
然后再通过指针找出对应行的所处数据。
这种方式就不再是全表检索了。
字符的方式也一样:
字符的方式 比如因为或汉子
都会按照ASCII码进行大小判断
B+Tree
上图是一个 5叉B+Tree
id是 1到15
B+Tree规则:
1.B+跟B树不同B+树的非叶子节点不保存关键字记录的指针,只进行数据索引,这样使得B+树每个非叶子节点所能保存的关键字大大增加;
2.B+树叶子节点保存了父节点的所有关键字记录的指针,所有数据地址必须要到叶子节点才能获取到。所以每次数据查询的次数都一样
3.B+Tree假设是M叉,那么key就是M-1
通过B+树的方式,在大量数据面前,可以快速的找到对应的键,从而通过指针获取到对应的值.
不过索引本身也需要存储空间,以及在执行改动数据的时候.索引也会需要时间来变动,可以根据以往的经验来创建索引.
聚集索引:
- 介绍:聚集索引指的是叶子结点下存储的数据就是行数据,默认 主键或者唯一索引,当没有一条列可以保证唯一性时,则会新增一条隐藏列当作聚集索引。通过聚集索引的叶子结点找到行数据是非常快的,因为索引和数据都在同一个文件,不需要额外的IO.
- 非聚集索引最后的叶子结点存储的则是主键id,再通过主键id查找到对应数据.
结尾:
- 索引快的原因在于不需要全局匹对,只需要按照范围进行计算,获取出对应值的地址,再根据地址获取行数据
- 节点的范围计算是由内存进行的所以效率会非常的快,又由于使用的结构是B+树,所以到叶子节点的次数也不会特别多.