MySQL(一)

一、InnoDB数据页结构

查找记录先通过(表空间ID+页号)定位记录所在页,再经过比如说:主键查找
记录1的heap_no为2,因为Infimum的heap_no为0,Supermum的heap_no为1

二、记录头信息

记录存储为单向链表+数据页存储为双向链表

三、删除记录操作的影响——删除又插入同一记录,deleted_flag重置为0

Infimum只能自己一组——n_owned值为1,Supermum组成员为1~8条

问:Infimum最小值和Supermum最小值指的是数据大小还是排位大小?

答:页存储的数据按主键排序,最小值和最大值指的是主键。

Ps:假如表需要user_id作为主键,建议还是保留id为主键,user_id置为unique列同时建立二级索引

四、Page Directory在页中的展现——用于记录每组的最大记录,数据页查找时,从Page Directory中第一次找到大于等于查找值,查找值就在此组别中,然后从目标组前一组别的Slot向下查找

普通组成员4~8条。第一普通组成立会从Supermum拉三条加新记录组成4位成员的普通组,同时Supermum组别成员从 8-3=5,变成5位成员

问:非主键查找,怎么通过Page Directory比大小?

答:没办法比大小,只能建立二级索引。没有二级索引就从头开始遍历查找

Ps:主键索引=聚簇索引=一级索引,非主键索引=非聚簇索引=二级索引,聚簇索引不指定默认会创建

五、页满后的插入操作

记录有序,页也是有序(不建议主键用MD5,MD5是无序的),这是一级索引的数据页

六、B树和B+树的区别(阶数3)

MySQL索引和B+树关系:一个树节点等同于一个数据页,普通叶子节点有双向指针,同层目录项也有双向指针(非叶子节点称为目录项)

相同点:

1.一个节点可以存储多个元素

2.所有叶子节点都位于同一层

3.叶子节点是有序的

4.叶子节点按从小到大排序:左小右大

5.根节点元素个数:1 <= k <= m-1,非根节点元素个数:m/2 <= k <= m-1(m表示阶数)

不同点:

1.B+树叶子节点有单向指针,B树没有

2.B+树元素有重复,B树没有

七、聚簇索引——从叶子节点往上建树

蓝色代表record_type,黄色代表next_record,粉色代表主键+c2列+c3列

Ps:非叶子节点中存储的是主键+页号,通过页号定位找叶子节点

Ps:MySQL中B+树一般三四层就可以存储千万级甚至上亿的数据,正常业务中一张表存储1至2千万数据算到头,再多就影响读取速度

Ps:比如范围查找主键4到10,先从4开始找,找到叶子节点利用页的双向链表进行范围查,而不是从头开始找5

Ps:每次申请新页都会分配一个Page_no,页号不是连续的,申请完后永远不变

问:只有聚簇索引,select * from index_demo where c2 = 9怎么查?

答:c2没有二级索引的话,只能从叶子节点头节点往下查

问:MySQL一定有主键吗?

答:可以没有主键,但是没有主键的情况下,程序默认将row_id做成主键索引;如果有unique并且非空的列(有多个则会找第一列unique非空),会将此列做成主键索引

八、二级索引

问:什么叫回表查询?

答:一级索引B+树叶子节点存储的是主键和数据,二级索引存储的是索引和主键(通过主键再去一级索引B+树中查询数据)

回表是随机查时间比较长,假如一条回表次数多还不如全表顺序查,MySQL会走全表查(优化器有对比规则)

Ps:B+树非叶子节点目录项指的就是索引,record_type值为1,所以索引在底层来看也可以算一条记录

问:二级索引不回表查询?

答:假设二级索引为user_id。select c1 from index_demo where c2 = 9,那c1本就存储在二级索引B+树中,此情况不需要回表;如果select c3 from index_demo where c2 = 9 ,这种情况就需要回到一级索引B+树的叶子节点查询数据

九、组合索引

c2在前,先按c2排序,c3在后,c2相等再按c3排序

问:用【c2,c3】建立的联合索引,查c2用得到吗?查c3呢?【c3,c2】呢?

答:查c2,【c2,c3】用得到,查c3,【c3,c2】用不到,具体参考上图

十、目录项的唯一性——加上主键

一张表三个索引及以下保障性能

你可能感兴趣的:(MySQL(一))