观《MYSQL技术内内幕 InnoDB存储引擎 第2版》(一) —— MYSQL体系结构和存储引擎
1.定义数据库和实例
数据库(文件的集合):物理操作系统文件或其他形式文件类型的集合。在MySQL数据库中,数据库文件可以是frm、MYD、MYI、ibd结尾的文件;当使用NDB引擎时,数据库文件是存放于内存中的文件。
实例(程序):MySQL数据库由后台线程以及一个共享内存区组成。共享内存区可以被运行的后台线程共享。数据库实例是真正用于操作数据库文件的。
MySQL是一个单进程多线程架构的数据库,MySQL数据库实例在系统上的表现就是一个进程。
启动实例时,MySQL数据库会去读取配置文件,根据配置文件参数启动数据库实例。读取顺序为 /etc/my.cnf -----> /etc/mysql/my.cnf -----> /usr/local/mysql/etc/my.cnf -----> ~/.my.cnf
2.MySQL体系结构

- 连接池组件
- 管理服务和工具组件
- SQL 接口组件
- 查询分析器组件
- 优化器组件
- 缓冲组件
- 插件式存储引擎
- 物理文件
3.MySQL存储引擎(可根据预定义的存储引擎接口编写自己的存储引擎)
InnoDB存储引擎:
支持事务,设计目标面向 在线事务处理(OLTP)应用。行锁设计、支持外键、支持非锁定读。
数据存放在一个逻辑的表空间中,将每个表单独存放到一个 ibd 文件中,支持裸设备(row disk)创建表空间。
使用多版本并发控制(MVCC)来获取高并发行=性,并实现 SQL 标准的4种隔离级别,默认位 REPEARABLE 级别。同时,使用 next-key-locking 的策略避免幻读(phantom)。提供插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index),预读(read ahead)等高性能和高可用功能。
使用 聚集(clustered)方式存储数据,每张表都是按主键顺序进行存放,若无显示定义主键,InnoDB为每一行生成一个6字节的 ROWID 作为主键。
MyISAM存储引擎:
MyISAM 不支持事务、表锁设计;支持全文索引,主要面向 OLAP。缓冲池只缓存索引文件,不缓存数据文件。
MyISAM存储引擎表由 MYD(存放数据文件) 和 MYI(存放索引文件) 组成,可以通过 myisampack 工具(赫夫曼编码静态算法) 压缩数据文件,压缩后的表只读。
NDB存储引擎:
集群存储引擎,高性能、高可用, share nothing 的集群架构,数据可以全部放在内存中,主键查找速度极快,可以添加数据存储节点线性提高数据性能。
连接操作(JOIN)在数据库层完成,查询很慢
Memory 存储引擎(之前称为 HEAP 存储引擎):
将表中数据存放在内存中,没有持久化,适合临时表。默认使用hash索引。
只支持表锁,并发性能差。
Archive存储引擎:
只支持 INSERT 和 SELECT 操作,使用 zlib 算法将数据行压缩存储,压缩比 1:10,适合存储归档文件
Federated存储引擎:
不存放数据。指向一台远程MySQL数据服务器上的表。
Maria存储引擎:
可以看作 MyISAM 后续版。支持缓存数据和索引文件,应用行锁设计,提供MVCC功能,支持事务和非事务安全的选项,以及更好的BLOB字符类型的处理性能。
其他存储引擎:
还有 Merge、 CSV、Sphinx 和 Infobright 。。。
4.各存储引擎之间的比较

可以通过 SHOW ENGINES; 或 查找 information_schema 数据库下的ENGINES表 查看数据库支持的存储引擎。
5.连接MySQL
TCP/IP:mysql会先去检查用户的权限
mysql -h xxx.xxx.xxx.xxx -u root -p
命名管道和共享内存:
在 windows 平台上,如果两个需要进程通信的进程在同一台服务器上,可以使用命名管道,配置文件中启用 --enable-named-pipe选项,若想使用共享内存,配置文件中添加 --shared-memory,连接时使用 --protocol=memory。
UNIX 域套接字:
在 linux 和 unix环境下,只能在 MySQL 客户端和数据库实例在一台服务器上才能使用,用户可在配置文件中指定套接字文件路径, --socket=/tmp/mysql.sock。当实例启动后, 可使用 SHOW VARIABLES LIKE 'socket' 查找套接字文件。使用套接字连接:
mysql -uroot -S /tmp/mysql.sock

浙公网安备 33010602011771号