索引

索引是帮助mysql高效获取数据的排好序的数据结构
**

二叉搜索树

当索引单调递增增长的时候 二叉树会退化为链表 查询效率很低
image.png

红黑树

解决了单调增长时带来的问题
image.png
但是当数据量非常巨大时 树的高度也会很高 访问叶子节点的效率还是很低

B+树

B树与B+树特性介绍:https://zhuanlan.zhihu.com/p/98021010
https://jishuin.proginn.com/p/763bfbd296b7
演示:https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html
image.png

Hash表

对每一个索引元素计算哈希散列值,存储在哈希表中,表查询的时候对索引进行依次哈希运算,找到在哈希表的位置
也就能定位到磁盘位置
如果是等值查询,那么哈希索引明显有绝对优势,因为只需要经过一次算法即可找到相应的键值;当然了,这个前提是,键值都是唯一的。如果键值不是唯一的,就需要先找到该键所在位置,然后再根据链表往后扫描,直到找到相应的数据;
但是,如果是范围查询检索,这时候哈希索引就毫无用武之地了.
**

Myisam存储引擎

索引文件和数据文件分离(非聚集)
数据文件为my d(data)
索引文件为my i(index)
此外还有一个存储结构的frm(frame)文件

Innodb存储引擎

框架frm文件
数据和索引ibd文件
image.png

表必须有主键作为索引来维护表的结构
不要设置为uuid类型 因为表查询的时候需要进行索引比对
整型对比更快,而且占用空间更小
而且uuid插入的时候是乱序的 b+树需要不断做平衡操作
b+树叶子节点指针为双向指针,便于范围查询

Insert into select from

之前一直看到这个文章,这个语句会出问题是因为mysql不使用索引查找和锁定行的话会进行全表扫描并锁住所有的行,所以只能用于冷处理.