B站:https://www.bilibili.com/video/BV1aE41117sk?from=search&seid=1105170498701006939
数据结构特点网站:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
1.索引
如果不加索引,就是一行行查找
把col2作为索引
假如用二叉树作为索引
二叉树节点里存放的是key-value
表的数据是放在磁盘的(索引也是)
key放索引字段、value放索引字段所在行的磁盘地址文件指针
找到了89这个key,取出89所在行的磁盘地址文件指针
这样再在磁盘上去找一次就可以啦
二叉树索引结构
不用二叉树,是因为单调情况性能低
红黑树(平衡二叉树)索引结构
不用红黑树,是因为数据量大时性能低
Hash索引结构
不用Hash表,是因为它不支持范围查找
2.B树索引结构
3.B+树索引结构
B与B+区别
1.B+树叶子结点比B树多了指针(适合范围查找)
2.B+树非叶子结点只存了索引,没有data数据(这样一个结点就可以存更多的索引)
3.B+树的叶子结点是存了所有结点,非叶子结点存储了冗余的索引
为什么不把所有结点放在一个叶子结点呢
加载的时候要把所有元素放到内存,耗时太久,浪费内存
h为3的B+树可存放2千万数据
B+树一个叶子结点是16KB
假如主键索引设为bigint,占8Byte
索引之间的空格是指针,指向下一个打的结点的磁盘文件的地址指针,占6B
16K/(8+6)=1170,所以一个结点可以存放1170个索引
不同的mysql存储引擎存放data的元素不一样,有的存放索引所在行的磁盘地址文件指针,有的存放索引所在行的其他所有字段
假设叶节点的索引+data占用1KB
则一个叶子结点存放16个索引元素
所以一个h为3的B+数最多可存放1170117016=2千多万
树的根节点一般放内存RAM里面
找到叶子结点,load两次,做两次磁盘I/O就可以找到了
速度就很快
4.MyISAM与InnoDB(形容数据库表)
MyISAM
select * from t where col1=49
1.col1是索引字段,就去MYI文件里
2.B+树中查找:先从内存取根节点,比对
3.load第二层的结点到内存,找到49
4.把它右边的指针对应的磁盘文件地址指针load,再比对
5.找到key49,对应的data为0x90,再去MYD中定位
frm:框架,是表结构定义的语句
MYD:data,数据
MYI:index,索引
InnoDB(聚集索引:索引和数据在一个文件)(支持行锁与事务)
mysql默认建立主键
用UUID不好:不方便比较,占用空间长
用整型自增好:B+树中每个节点从左到右是递增的
叶节点的指针,右边的>左边的
若不是递增的索引插入,B+树可能会分裂并调节平衡,性能开销大
所以用自增,永远在最后一个后面去加入节点
where col>20
先查找到20,先把20右边的30放入结果集,再顺着指针全部放入
frm:框架
ibd:index+data
联合索引(未完善)
第二个视频
https://www.bilibili.com/video/BV1ut41177j7?from=search&seid=7747381139812202031
innoDB(支持行锁与事务)
cpu才能用来做where条件中的比较
操作系统局部性原理
一次取一页 4KB放入内存
innoDB中
一次取一页 16KB