读书笔记-《MySQL技术内幕-InnoDB存储引擎》-4~6章

第四章:表

表都是根据主键顺序存放的,即索引组织表。

使用第一个定义的非空唯一索引作为主键,如果没有则创建一个6字节的指针。

逻辑存储:表空间(tablespace)、段(segment)、区(extent)、页(page)、行(row)。

段:由引擎自身管理,与Oracle自动段空间管理类似。在开始时先用32个碎片页来存储数据,而后才是64个连续页的申请。对于小表或是undo段可减少空间消耗。

区:大小恒为1MB。默认包含64个连续页,每个页大小16KB(16384字节)。

页:常见类型为数据页、undo页、系统页、事务数据页。每个页最多存放16KB / 2-200 = 7992 行记录。

Barracuda File Format 包括 Antelope、Compressed、Dynamic,Antelope 包括 Compact、Redundant。

新的行记录格式Compressed、Dynamic,行溢出时仅在数据页存放20字节的指针。Compressed使用zlib算法压缩行数据,特别适合blob、text、varchar。

Compact

变长字段长度列表 NULL标志位 记录头信息

列1

除了用户定义还包括

事务ID列、回滚指针列

列2

如果没有主键

还会有个rowid指针

……

表结构为

t1 varchar(10)

t2 varchar(10)

t3 char(10)

t4 varchar(10)

未设置主键

单字节latin1编码

插入两条数据

('a', 'bb', 'bb', 'ccc')

('d', NULL, NULL, 'fff')

第一条记录

03 02 01 // 倒序 varchar 的真实长度

00 // NULL标志位 第一条记录没有NULL

00 00 10 00 2c // 记录头信息,0x2c为下一条记录的偏移量,即当前记录+偏移量 = 下条记录起始位置

00 00 00 2b 68 00 // 没有主键产生的指针

00 00 00 00 06 05 // 事务ID

80 00 0000 32 01 10 // 回滚指针列

61 // a

62 62 // bb

62 62 20 20 20 20 20 20 20 20 // bb 空余的用20填充

63 63 63 // ccc

第二条记录

03 01 // 同左

06 // 存在NULL值

00 00 20 ff 98 // 同左

00 00 00 2b 68 02 // 同左

00 00 00 00 06 07 // 同左

80 00 00 00 32 01 10 // 同左

64 // d

66 66 66 // fff

Redundant:与Compact类似,不过Char类型的NULL值会占用空间。

多字节字符集(UTF-8)的情况下,char与varchar的实际行存储没有区别。

外键约束:保证数据的完整性和一致性。但目前主流的环境是数据库结构经常变动、性能要求高,导致现在的设计原则是,将关系交给业务层来维护。

分区:MySQL支持的类型为水平分区(按行记录拆分)、局部分区(将数据和索引放一起)。

MySQL的分区方式:Range(行数据属于一个给定连续区间的记录被放入分区)、List(与Range类似,不过是离散的值)、Hash(根据用户自定义的表达式返回值来分区)、Key(通过MySQL提供的Hash函数来分区)。

分区的意义在于减少不必要的分区的检索,反之如果设计不当,总是查询所有的分区反而会增加大量IO次数降低效率。

(分区、分表、索引:三者并不冲突,可以同时使用。分区强调归档整理,同时提高效率;分表和分区类似,将实现方式交由自己控制;索引与分区没什么关系,都是交由MySQL实现)

第五章:索引与算法

这里直接展示图片。依次可以看到仅有聚集索引(主键)时表的逻辑存储方式、有聚集索引和辅助索引时的逻辑存储方式、联合索引的逻辑存储方式。

继续展示图片:关于B-tree 与 B+tree

二分查找法 - 二叉查找树 - 平衡二叉树 - 多路查找树 - B+tree

DML(Database Manipulation Language) 数据库表数据操作语言 Insert,Delete,Update,Truncate
DDL(Database Definition Language) 数据库表结构操作语言 Create,Alter
DCL(Database Control language) 数据库权限控制操作语言 Grant,Remove
DQL(Database Query Language) 数据库表数据查询语言 Select

聚集索引:InnoDB为索引组织表,即聚集索引按照每张表的主键构造一棵B+tree,同时叶子结点中存放的整张表的行记录数据。

由于数据页只能按照一棵B+tree树进行排序,所以每张表只能有一个聚集索引(主键)。

辅助索引:其叶子结点包含键值和指向对应行数据的聚集索引的指针。

Cardinality:不重复记录数量的预估值,如果Cardinality / n_rows_in_table 越接近1(即越趋近于每条记录的该字段都不重复),该字段开启索引越有价值。

第六章:锁

待学习

发布了25 篇原创文章 · 获赞 12 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_25498677/article/details/102412106