5、MyISAM和Innodb引擎(表级别)
数据存储文件
-
MyISAM数据存储文件有3个,索引和数据文件是分离的,非聚集的
1).frm 表结构文件
2).MYI 索引文件
3).MYD 数据文件 -
Innodb数据存储文件有2个,索引和数据文件是合并的,聚集的,聚簇索引
1).frm 表结构文件
2).ibd 数据文件
MyISAM 数据结构
- 主键索引
- 非主键索引
由上图可看出,MyISAM引擎的主键索引 和非主键索引的数据结构是一样的,叶子节点都存着数据的物理位置,指向数据的磁盘位置
Innodb数据结构
- 主键索引(聚簇索引)
- 非主键索引(二级索引)
Innodb的主键索引和非主键索引的数据结构有着巨大的不同
1)主键索引的叶子节点存储着数据,索引和数据是聚集的。
2)非主键索引的叶子节点指向的是主键。
Innodb为什么必须有主键,并且自增
- 要根据主键建立主键索引,而且数据的存储是根据页(单位)来存储的,一个叶子节点的末尾指向下一个叶子节点的开始,方便按范围查询数据
- 如果数据库建表的时候,不设置主键,那么系统会找出一个数据差别比较大的列作为主键,如果数据差异性都不太大,数据库会自动生成一个主键。
为什么UUID不能设置为主键
- UUID为字符串,数据库将字符串解析为ASCI码来比较大小。查询的时候,都需要将字符串解析为ASCI码,来查询,效率低
- 最严重的是插入。
1)自增的主键,在插入的时候,假如其他页已经满了,会新建一个页,然后按照顺序插入到页
2)UUID是随机生成的,不是按序排列的,有可能随机生成的UUID,解析为ASCI码的时候,是最小的。这样就会插入到已经满员的页中,会使数据结构中的度,开始分裂,影响平衡树,插入的代价很高
分库分表的主键怎么设置
根据初始ID 和步长设置主键
A1: 起始主键ID: 1 步长:3 主键:1,4,7,10
A2: 起始主键ID: 2 步长:3 主键:2,5,8,11
A3: 起始主键ID: 3 步长:3 主键:3,6,9,12