第1章 MySQL体系结构和存储引擎
1.1 定义数据库和实例
数据库:
物理操作系统文件或其他形式文件类型的集合。MySQL数据库中,数据库文件可以是frm、MYD、MYI、ibd结尾的文件。当使用NDB引擎时,数据库文件可能不是操作系统上的文件,而是存放于内存之中的文件。
实例:
MySQL数据库由后台线程以及一个共享内存区组成。数据库实例才是真正用于操作数据库文件的。
MySQL是一个单进程多线程架构的数据库,系统上表现的是一个进程。
对应关系:
一个实例对应一个数据库,一个数据库对应一个实例。
集群模式、多例下:可能存在一个数据库被多个实例使用的情况
实战:
启动数据库实例:
./mysqld_safe&
观察进程情况:
ps -ef | grep mysqld
启动实例时,MySQL数据库会读取配置文件,根据配置文件的参数来启动数据库实例。(没有配置文件,MySQL则会按照编译时的默认参数设置启动实例)
查看当MySQL数据库实例启动时,会在哪些位置查找配置文件:
mysql --help | grep my.cnf
几个配置文件同一个参数以读取到的最后一个配置文件的参数为准。
1.2 MySQL体系结构
数据库是由一个个文件组成(通常是二进制文件),对这些文件进行数据库操作(如insert,delete,update,select)需要通过数据库实例来完成对数据库的操作。
1.2.1 MySQL体系结构图:
1.2.2 MySQL由以下部分组成:
- 连接池
- 管理服务和工具
- SQL接口
- 查询分析器
- 缓冲(Cache)
- 插件式存储引擎:提供了一系列标准的管理和服务支持,这些标准与存储引擎本身无关,可能是每个数据库系统本身必须的,如SQL分析器和优化器,而存储引擎是底层物理结构的实现。
- 物理文件
1.3 MySQL存储引擎
存储引擎是MySQL体系结构的核心。
存储引擎是基于表的,而不是数据库。
1.3.1 InnoDB 存储引擎
InnoDB 存储引擎是MySQL数据库最常用的一种引擎。
- 支持事务,设计目标主要面向在线事务处理(OLTP)的应用。特点是行锁设计、支持外键,并支持类似Oracle的非锁定锁(即默认读取操作不会产生锁)。5.5.8版本开始,InnoDB存储引擎是默认的存储引擎
- 将数据放在一个逻辑的表空间中,表空间由 InnoDB存储引擎自身进行管理。4.1版本(包括4.1)开始,可以将每个单独的表存放到一个独立的ibd文件中。
- 通过多版本并发控制(MVCC)来获得高并发性,实现了SQL标准的4种隔离级别,默认为REPEATABLE级别。通过next-key locking的策略来避免幻读。提供插入缓冲、二次写、自适应哈希索引、预读等高性能和高可用功能。
- 表中数据存储采用聚集的方式,因此每张表的存储都是按主键的顺序存放。没有显示地在表定义时指定主键,将会为每一行生成6字节的ROWID,并以此作为主键。
1.3.2 MyISAM 存储引擎
- 不支持事务、表锁设计,支持全文索引,主要面向OLAP数据库应用。5.5.8之前MyISAM存储引擎是默认的存储引擎(除Windows版本外)。缓冲池只缓存(cache)索引文件,而不缓存数据文件,数据文件的缓存由操作系统本身完成。
- 表由MYD和MYI组成,MYD用来存放数据文件,MYI用来存放索引文件。可用myisampack工具进一步压缩数据文件,压缩后的表是只读的(由于用赫夫曼编码静态算法来压缩数据)。
- 5.0版本之前默认支持表大小为4G,需要大于4G,要制定 MAX_ROWS 和 AVG_ROW_LENGTH 属性。5.0版本开始,默认支持256TB的单表数据。
1.3.3 NDB 存储引擎
- 是一个集群存储引擎,类似Oracle的RAC集群。特点是数据全部放在内存中(5.1版本开始,可以将非索引数据放在磁盘上),因此主键查找速度极快,并通过添加NDB数据存储节点可以线性地提高数据库性能。
- 连接操作(JOIN)是在MySQL数据库层完成的,而不是在存储引擎完成的。意味着,复杂的连接操作需要巨大的网络开销,查询数据很慢。
1.3.4 Memory(HEAP)存储引擎
- 将表的数据存放在内存中,如果数据库重启或崩溃,表中数据都将消失。适用于存储临时数据的临时表,以及数据仓库中的维度表。默认使用哈希索引,而不是B+树索引。
- 速度快,但有限制。如只支持表锁,并发性能差,不支持TEXT和BLOB列类型。存储变长字段(varchar)时是按照定常字段(char)的方式进行的,因此会浪费内存。
- MySQL数据库使用Memory存储引擎作为临时表来存放查询的中间结果集。如果中间结果集大于Memory存储引擎表的容量设置,或中间结果含有TEXT/BLOB列类型字段,则MySQL数据库会把其转换到MyISAM存储引擎表而存放到磁盘中。MyISAM不缓存数据文件,因此产生的临时表的性能对于查询会有损失。
1.3.5 Archive 存储引擎
- 只支持insert和select操作,5.1版本开始支持索引。
- 使用zlib算法将数据行(row)进行压缩后存储,压缩比(1:10)左右,适合存储归档数据,如日志信息。
- 行锁来实现高并发的插入操作,但是本身不是事务安全的存储引擎,主要是为了提供高速的插入和压缩功能。
1.3.6 Federated 存储引擎
表不存放数据,只是指向另一台MySQL数据库服务器上的表。(类似SQL Server的链接服务器和Oracle的透明网关),区别是Federated 存储引擎只支持MySQL数据库表,不支持异构数据库表。
1.3.7 Maria 存储引擎
目的是取代原有MyISAM存储引擎,从而成为默认的存储引擎。特点是:支持缓存数据和索引文件,应用了行锁设计,提供了MVCC功能,支持事务和非事务安全的选项,以及更好的BLOB字符类型的处理性能。
1.3.8 其他存储引擎存储引擎
Merge、CSV、Sphinx和Infobright。
支持全文索引:MyISAM 、InnoDB(1.2版本)和Sphinx存储引擎都支持。
1.4 各存储引擎之间的比较
不同MySQL存储引擎相关特性比较:
实战:
查看当前使用的MySQL数据库所支持的存储引擎:SHOW ENGINES
查找information_schema架构下的ENGINES表
1.SHOW ENGINES\G
2.information_schema
MySQL提供了一个用来演示MySQL各项功能的示例数据库。下载示例数据库
1.5 连接MySQL
连接MySQL操作是一个连接进程和MySQL数据库实例进行通信。本质上是进程通信。
常用的进程通信方式有管道、命名管道、命名字、TCP/IP套接字、UNIX域套接字。
1.5.1 TCP/IP
客户端和MySQL实例在不同服务器上。
MySQL数据库在任何平台下都提供的连接方式。
在TCP/IP连接上建立一个基于网络的连接请求,通常**客户端(client)**在一台服务器上,MySQL实例(server)在另一台服务器上,这两台服务器通过TCP/IP网络连接。连接成功后就可以对MySQL数据库进行数据库操作,如DDL和DML等。
通过TCP/IP连接到MySQL实例时,MySQL数据库会先检查一张权限视图,用来判断发起请求的客户端IP是否允许连接到MySQL实例。该视图在mysql架构上,表名为user。
USE mysql
SELECT host,user,password from user;
用户权限表下,david用户在任何IP段下连接该实例,并且不需要密码。
1.5.2 命名管道和共享内存
命名管道:
两个需要进程通信的进程在同一台服务器上
在Windows 2000、Windows XP、Windows 2003 和 Windows Vista以及在此之上的平台上,如果两个需要进程通信的进程在同一台服务器上,那么可以使用命名管道,SQL Server数据库默认安装后的本地连接也是使用命名管道。
MySQL数据库需在配置文件中启用–enable-named-pipe选项。
共享内存:
在4.1之后的版本,提供共享内存的连接方式。
配置文件中添加:–shared-memory
连接时,MySQL客户端还必须使用:–protocol=memory选项
1.5.3 UNIX域套接字
Linux和UNIX环境下。
UNIX域套接字不是网络协议,所以只能在MySQL客户端和数据库实例在一台服务器上的情况下使用。
用户可以通过配置文件指定套接字文件的路径如–socket=/tmp/mysql.sock。
1.当数据库实例启动后,用户可以通过下列命令来进行UNIX域套接字文件的查找:
SHOW VARIABLES LIKE 'socket';
将会返回UNIX域套接字文件的路径,如/tmp/mysql.sock
2.连接:
mysql -udavid -S /tmp/mysql.sock
-udavid:用户权限表下,david用户在任何IP段下连接该实例,并且不需要密码。
1.6 小结
数据库和数据库实例的定义->MySQL数据库体系结构->“实例”和”数据库“的区别
各种常见表存储引擎的特性、适用情况,以及区别。