MySQL的总体架构如下图所示

包括数据库连接器、连接池、SQL接口、解析器、优化器、缓存、存储引擎的等。其中常用的存储引擎为Innodb和MyISAM。Innodb有如下特点:
- 使用Table Space的方式进行数据存储,表现为
/var/lib/mysql/ibdata1
文件和/var/lib/mysql/ib_logfile0
文件; - 支持事物、外键约束等数据库特性;
- 支持行级锁(Row level lock),读写性能都非常优秀;
- 能够承载大数据量的存储和访问;
- 拥有自己独立的缓冲池,能够缓存数据和索引
- 在关闭自动提交的情况下,与MyISAM引擎的速度差异不大;
MyISAM存储引擎具有如下特点:
- 数据存储方式简单,使用B+ Tree进行索引;
- 使用三个文件定义一个表: .MYI .MYD .frm;
- 少碎片、支持大文件、能够进行索引压缩;
- 二进制层次的文件可以移植(Linux->Windows);
- 访问速度飞快,是所有MySQL文件引擎中速度最快的;
- 不支持一些数据库特性,比如事物、外键约束等;
- 表级别锁(Table level lock),性能稍差,更适合读多的操作;
- 表数据容量有限,一般建议单表数据量介于50W~200W之间;
- 增删改查操作完后要使用myisamchk检查优化表;
Innodb的逻辑存储结构如下所示:

逻辑上所有数据都存放在一个表空间中(TableSpace);表空间管理的单元是段(Segment),分为数据段(B+ Tree的叶子节点)、索引段和回滚段(B+ Tree的非叶子节点)等;每个段内有若干个区(Extent);每个区内有若干页(Page);对于数据段来说每一个页内存储了数据库记录。
- 在
innodb_file_per_table
参数值为off的情况下,Innodb会将所有数据都存放到到一个共享的表空间内(物理上表现为所有数据都存放到共享的ibdata文件中,如/var/lib/mysql/ibdata1
文件)。 - 参数值为on的情况下innodb会为每个表都建立一个独立的表空间,表的数据、索引和插入缓冲都是放在该独立的表空间内,而其他类型的数据,如undo信息、系统事物信息、二次写缓存等还是放在原来的共享表空间内(ibdata文件),默认情况下会在
/var/lib/mysql/数据库名/
目录下生成表明.frm
(表结构文件)和表名.ibd
(表数据文件)两个文件用于存放数据、索引和插入缓冲。
- 常见的Segment有数据段、索引段和回滚段,每一个段对应B+ Tree中的一个节点,其中数据段为B+ Tree的叶节点(leaf node segment),索引段为B+ tree的非叶节点(none-leaf node segment);
- 段的管理有引擎本身完成;
- 区是由连续的64个页组成;
- 每个页大小为16k;
- 即每个区大小为(64*16k)=1MB;
- 对于大的数据段,MySQL每次最多可以申请4个区,以保证数据的顺序性能;
ҳ(page)
- Innodb的页也称为块(Block);
- 页是Innodb磁盘管理的最小单位;
- Innodb每个页的默认大小是16KB;
- 可以通过参数innodb_page_size将页的大小设置为 4k/8k/16k;
- 每个页里面存储的是行信息;
转载请标明出处:[数据库] MySql知识点总结
文章来源: [数据库] MySql知识点总结