1.索引

mysql无索引备库回放_字段

如果不加索引,就是一行行查找

把col2作为索引

假如用二叉树作为索引

二叉树节点里存放的是key-value

表的数据是放在磁盘的(索引也是)

key放索引字段、value放索引字段所在行的磁盘地址文件指针

mysql无索引备库回放_字段_02


找到了89这个key,取出89所在行的磁盘地址文件指针

这样再在磁盘上去找一次就可以啦

二叉树索引结构

不用二叉树,是因为单调情况性能低

红黑树(平衡二叉树)索引结构

不用红黑树,是因为数据量大时性能低

Hash索引结构

不用Hash表,是因为它不支持范围查找

2.B树索引结构

mysql无索引备库回放_mysql无索引备库回放_03

3.B+树索引结构

mysql无索引备库回放_数据_04

B与B+区别

1.B+树叶子结点比B树多了指针(适合范围查找)
2.B+树非叶子结点只存了索引,没有data数据(这样一个结点就可以存更多的索引)
3.B+树的叶子结点是存了所有结点,非叶子结点存储了冗余的索引

为什么不把所有结点放在一个叶子结点呢

加载的时候要把所有元素放到内存,耗时太久,浪费内存

mysql无索引备库回放_mysql无索引备库回放_05

h为3的B+树可存放2千万数据

B+树一个叶子结点是16KB

假如主键索引设为bigint,占8Byte

索引之间的空格是指针,指向下一个打的结点的磁盘文件的地址指针,占6B

mysql无索引备库回放_结点_06


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中定位

mysql无索引备库回放_mysql无索引备库回放_07


mysql无索引备库回放_mysql无索引备库回放_08


frm:框架,是表结构定义的语句

MYD:data,数据

MYI:index,索引

InnoDB(聚集索引:索引和数据在一个文件)(支持行锁与事务)

mysql默认建立主键

用UUID不好:不方便比较,占用空间长
用整型自增好:B+树中每个节点从左到右是递增的
叶节点的指针,右边的>左边的
若不是递增的索引插入,B+树可能会分裂并调节平衡,性能开销大
所以用自增,永远在最后一个后面去加入节点

where col>20

先查找到20,先把20右边的30放入结果集,再顺着指针全部放入

mysql无索引备库回放_mysql无索引备库回放_09

mysql无索引备库回放_数据_10


frm:框架

ibd:index+data

联合索引(未完善)

mysql无索引备库回放_数据_11

第二个视频

https://www.bilibili.com/video/BV1ut41177j7?from=search&seid=7747381139812202031

innoDB(支持行锁与事务)

cpu才能用来做where条件中的比较

操作系统局部性原理
一次取一页 4KB放入内存

innoDB中
一次取一页 16KB