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体系结构
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/
The post MySQL体系结构和存储引擎 first appeared on 司马他.文章来源:
Author:司马他
link:https://www.congcong.us/post/mysql_structure_and_engines.html