[NOTE-MySQL]MySQL体系结构和存储引擎

MySQL设计为一个可移植的数据库,可以在几乎所有操作系统上运行。

数据库和实例

数据库:物理操作系统文件或其他形式文件类型的集合。
数据库实例:由数据库后台进程/线程以及一个共享内存区组成。数据库实例才是真正用来操作数据库文件的。

两者通常一一对应,但是要知道集群情况下一个数据库可以被多个实例使用。

MySQL简述

MySQL是一个单进程多线程架构的数据库。比如用mysqld_safe启动,可以观察到就一个进程。

MySQL启动会多处位置寻找其配置文件my.cnf,比如 /etc/my.cnf -> /etc/mysql/my.cnf -> /usr/local/mysql/etc/my.cnf -> ~/.my.cnf 顺序寻找等等,如果多个均存在时,会以读取到的最后一个配置文件中的参数为准。Linux下一班存放在/etc/my.cnf下。

datadir指定数据库所在路径。比如可以通过 show variables like 'datadir'来查看

MySQL体系结构

image

Level1:管理服务和工具组件 连接池组件

Level2:管理服务和工具组件 SQL接口组件 & 查询分析器组件 & 优化器组件 & 缓存(Cache)组件

Level3:插件式存储引擎

Level4:物理文件

存储引擎是基于表的而不是数据库

MySQL表存储引擎

存储引擎的好处是,每个存储引擎都有各自的特点,能够根据具体的应用简历不同的存储引擎表。

InnoDB存储引擎

面向在线事务处理(OLTP)方面应用。

行锁设计、支持外键,默认情况下读取操作不会产生锁。

InnoDB存储引擎将数据放在一个逻辑的表空间中,可以使用裸设备(row disk)来建立其表空间。

InnoDB通过使用多版本并发控制(MVCC)来获得高并发性,默认为REPEATABLE级别。使用next-key locking的策略来避免幻读(phantom)现象产生。

InnoDB还提供了插入缓冲 insert buffer、二次写double write、自适应哈希索引adaptive hash index、预读read ahead等高性能和高可用功能。

InnoDB存储引擎对表中数据的存储,采用了聚集clustered的方式,每张表的存储都按主键的顺序存放,如果没有显式的再表定义时指定主键,InnoDB存储引擎会为每一行生成一个6字节的ROWID,并以此作为主键。

MyISAM存储引擎

不支持事务、表锁、全文搜索引擎。适合在线分析处理OLAP操作速度快。

存储引擎表由MYD和MYI组成,MYD存放数据文件,MYI存放索引文件。

可以通过myisampack工具来压缩文件,使用Huffman编码静态算法来压缩数据,压缩后的表是只读的。

5.0以前默认支持4G,通过MAX_ROWS和AVG_ROW_LENGTH属性改变。5.0以后,默认支持256T。

MyISAM存储引擎表,MySQL数据库只缓存其索引文件,数据文件缓存交由操作系统本身完成。

NDB存储引擎

share nothing的集群架构,高可用性,高性能。

全部存放在内存中(5.1后将非索引数据放在磁盘上)主键查找速度极快,通过添加NDB数据存储节点Data Node可以线性地提高数据库性能。

NDB的链接操作Join是在数据库层完成,而不是在存储引擎层完成的。复杂的join操作需要巨大的网络开销,查询速度很慢。

Memory存储引擎

表中数据存在内存,重启或崩溃将消失。适合临时表,或者数据仓库的纬度表。

默认哈希索引。

缺点:只支持表锁,并发性能差,不支持TEXT和BLOB,varchar按照char进行,浪费内存。

所以如果用Memory做临时表,如果超过容量,会自动转换为MYISAM,而MYISAM不缓存数据文件,所以临时表会对性能查询有损失。

ARchive存储引擎

只支持insert和select操作,5.1开始支持索引。设计目标提供高速插入和压缩功能。

使用zlib算法将数据行进行压缩存储。适合存储归档数据,如日志信息。

使用行锁实现高并发插入操作,但不是事务安全。

Federated存储引擎

不存放数据 指向远程MySQL数据库服务器上的表。

Maria存储引擎

MYISAM后续版本。

缓存数据和索引文件,行锁设计,提供MVCC功能,支持事务安全和非事务安全。

其他存储引擎

比如Merge CSV Sphinx和Infobright等

MySQL文档与示例数据库

http://dev.mysql.com/doc/

0条留言