第四章:表
表都是根据主键顺序存放的,即索引组织表。
使用第一个定义的非空唯一索引作为主键,如果没有则创建一个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(即越趋近于每条记录的该字段都不重复),该字段开启索引越有价值。
第六章:锁
待学习