目录
索引
是排好序的数据结构
结构自行构造的网站 https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
了解索引的数据结构比较关键,因为涉及到后期理解为什么工作过程中的sql语句走的是全表扫描。
BTree
一个节点可以存储多个数据
左边的数值<中间的数值<右边的数值
如果数值比较多的话,可能会造成树比较高,搜索次数比较多
B+Tree(InnoDB引擎,默认的是B+树)
有点像跳跃表,每个节点可以放多个数值,然后根据规则选出一个候选人出来作为上一级
- 叶子节点包括了所有的数值
- 叶子节点之间通过双向的指针进行链接,1、可以支持范围查找。2、加快了搜索速度。
- 非叶子节点作为冗余索引加快了搜索的速度,树的高度也不会太高。
索引的分类
Hash索引和B+Tree的索引
具体的好处可以看https://www.zhihu.com/question/67094336
大概就是:Hash索引更快,是数组+链表的结构,通过把值代入hash函数计算到数组index,再遍历挂在数组的链表得到最后硬盘里数据行所在的地址。
但是无法支持order by,所以比较少见。存放比较长的url等的信息的时候可以用这个比较快。
innoDB有自适应的索引可以灵活的使用到这个Hash索引。
聚簇索引和非聚簇索引
描述
主键索引(聚簇索引)叶子节点存放的是数据行所在的物理地址。
非主键索引(非聚簇索引)叶子节点存放的是主键的值,通过主键的值,去主键索引找数据行的物理地址(回表)。
MySQl主键索引是非主键索引,其他是非聚簇索引,好处:1、保持数据的一致性。坏处:非主键索引需要回表找到数据行地址。
主键索引设置成自增的好处
注意:MySQL建议每个表设置一个自增的主键。
好处:1、方便查找,通过主键可以顺序排序,不用全表扫描。
2、比起UUID来说,可以减少IO过程的内存损耗(要把索引从磁盘读取到内存后再进行扫描)
然而:因为工作中我用到oracle会比较多,所以一般主键是UUID更多些,估计原因如下
优点(转自:https://blog.csdn.net/yinni11/article/details/79897696)
能够保证独立性,程序可以在不同的数据库间迁移,效果不受影响。
保证生成的ID不仅是表独立的,而且是库独立的,这点在你想切分数据库的时候尤为重要。
在oracle做数据迁移的时候不会因为表的sequence不连续而出现问题
联合索引
根据第一个条件进行排序,第一个条件相同的情况下,用第二个条件进行排序,所以有个最左前缀原则(使用联合索引最左边的条件放where里面才会cover index)
主键索引和唯一索引的区别