文章目录
第1章 MySQL体系结构和存储引擎
1.1 定义数据库和实例
- 数据库
- 物理操作系统文件或其他形式文件类型的集合
- 实例
- MySQL数据库由后台线程以及一个共享内存区组成
- 共享内存可以被运行的后台线程共享
- 数据库实例是真正用于操作数据库文件的
- 在MySQL数据库中,实例与数据库通常是一一对应的
- 即一个实例对应一个数据库,一个数据库对应一个实例,但在集群情况下可能存在一个数据库被多个数据实例使用的情况
- MySQL被设计为一个单进程多线程架构的数据库,即MySQL数据库实例在系统上表现就是一个进程
- 当启动实例时,MySQL数据库会去读取配置文件,根据配置文件的参数来启动数据库实例
- Oracle数据库中如果没有参数文件,在启动实例时会提示找不到参数文件,数据库启动失败
- MySQL数据库中,可以没有配置文件,这种情况下会按照编译时的默认参数设置启动实例,数据库会根据文档顺序读取配置文件,以最后一个配置文件中的参数为准
1.2 MySQL体系结构
- 从概念上来说
- 数据库是文件的集合,是依照某种数据模型组织起来并存放于二级存储器中的数据集合
- 数据库实例是程序,是位于用户和操作系统之间的一层数据管理软件,用户对数据的任何操作,包括数据库定义、数据查询、数据维护、数据库运行控制等都是在数据库实例下进行的,应用程序只用通过数据库实例才能和数据库进行数据交换
- 即数据库是由一个个文件组成的,要对这些文件执行数据库操作不能通过操作文件来更改数据库的内容,需要通过数据库实例来完成对数据库的操作
- MySQL可以分为8个部分组成
- 第一层:网络连接层
- 连接池组件:管理、缓冲用户的连接,线程处理等需要缓存的需求
- 第二层:核心服务层
- 管理服务和工具组件:系统的管理和控制工具,例如备份恢复、复制、集群等
- SQL接口组件:接受SQL命令,并且返回查询结果
- 查询分析器组件:验证和解析SQL命令,例如过滤条件、语法结构等
- 优化器组件:在执行查询之前,使用默认的一套优化机制进行优化SQL语句
- 缓存组件:如果缓存当中有想查询的数据,则直接将缓存中的数据返回,若没有则重新查询
- 第三层:存储引擎层
- 插件式存储引擎:管理和操作数据的一种机制,包括(存储数据、如何更新、查询数据等))
- 第四层:系统文件层
- 物理文件:配置文件、数据文件、日志文件、错误文件、二进制文件等等的保存
- 第一层:网络连接层
- MySQL数据库区别于其他数据库的最重要的一个特点就是其插件式的表存储引擎
- 存储引擎是基于表的,不是数据库
1.3 MySQL存储引擎
- 存储引擎的好处是,每个存储引擎都有各自特点,能够根据具体的应用建立不同存储引擎表
- 根据MySQL数据库开源特性,存储引擎可以分为MySQL官方存储引擎和第三方存储引擎
- 如InnoDB存储引擎,后被Oracle收购
1.3.1 InnoDB存储引擎
- InnoDB存储引擎支持事务,其设计目标主要面向在线事务处理(OLTP)的应用,其特点是行锁设计、支持外键,支持非锁定读
- InnoDB存储引擎将数据放在一个逻辑的表空间中,这个表空间就像黑盒由InnoDB存储引擎自身进行管理
- InnoDB存储引擎使用多版本并发控制(MVCC)获得高并发性
- 实现了标准的4种隔开级别,使用next-key locking策略避免幻读
- 提供了插入缓冲、二次写、自适应哈希索引、预读等高性能和高可用功能
- InnoDB存储引擎采用了聚集的方式存储表中数据
- 每张表的存储都是按主键的顺序进行存放的
- 如果没有显式的在表定义时指定主键,InnoDB存储引擎会为每一行生成一个6字节的ROWID,并以此作为主键
1.3.2 MyISAM存储引擎
- MyISAM存储引擎不支持事务、表锁设计,支持全文索引,主要面向OLAP数据库应用
- MyISAM存储引擎的缓冲池只缓存索引文件,不缓冲数据文件并交由操作系统本身完成
- MyISAM存储引擎表由MYD和MYI组成,MYD用来存放数据文件,MYI用来存放索引文件
- 可以通过myisampack工具进一步压缩数据文件,该工具使用赫夫曼编码静态算法来压缩数据,因此压缩后的表时只读的,同时可以通过此工具解压数据文件
1.3.3 NDB存储引擎
- NDB存储引擎是一个集群存储引擎
- 数据全部存放在内存中,主键查找的速度极快,并且通过添加NDB数据存储节点可以线性的提高数据库性能,是高可用、高性能的集群系统
- NDB存储引擎的连接操作是在MySQL数据库层完成的,而不是在存储引擎层完成的
- 即复杂的连接操作需要巨大的网络开销,查询速度很慢
1.3.4 Memory存储引擎
- Memory存储引擎将表中的数据存放在内存中
- 若数据库重启或发生崩溃,表中的数据都会消失
- 适用于存储临时数据的临时表以及数据仓库中的纬度表
- 默认使用哈希索引,而不是B+树索引
- Memory存储引擎虽然速度非常快
- 只支持表锁,并发性能差
- 不支持TEXT和BLOB列类型
- 存储变长字段时按照定长字段的方式进行
- Memory存储引擎作为临时表来存放查询的中间结果集
- 若中间结果集大于Memory存储引擎表的容量设置,或中间结果含有TEXT或BLOB列类型字段
- MySQL数据库会把其转换到MyISAM存储引擎表而存放到磁盘中,MyISAM不缓存数据文件,因此这时产生的临时表对于查询会有损失
1.3.5 Archive存储引擎
- Archive存储引擎只支持INSERT和SELECT操作,支持索引
- 设计目标是提供高速的插入和压缩功能
- 适合存储归档数据,如日志信息
- Archive存储引擎使用zlib算法将数据行进行压缩后存储,压缩比一般可达1:10
- Archive存储引擎使用行锁来实现高并发的插入操作,但本身并不是食物安全的存储引擎
1.3.6 Federated存储引擎
- Federated存储引擎表不存放数据,只是指向一台远程MySQL数据库服务器上的表
- Federated存储引擎只支持MySQL数据库表,不支持异构数据库表
1.3.7 Maria存储引擎
- Maria存储引擎设计目标主要是用来取代原有的MyISAM存储引擎,可以看作是MyISAM的后续版本
- Maria存储引擎的特点
- 支持缓存数据和索引文件
- 应用了行锁设计
- 提供MVCC功能
- 支持事务和非事务安全的选项
- 更好的BLOB字符类型的处理性能
1.3.8 其他
- 为什么MySQL不支持全文索引?
- 错
- MySQL支持,MyISAM、Sphinx存储引擎都支持全文索引
- MySQL数据库速度快是因为不支持事务?
- 错
- MyISAM不支持事务,InnoDB支持事务
- 快是相对于不用应用来说的
- 对于ETL操作,MyISAM存储引擎会有优势
- 对于OLTP环境中,InnoDB存储引擎的效率更好
- 当表的数据量大于1000万时MySQL的性能会急剧下降吗?
- 不
- MySQL是数据库,不是文件,随着数据行数的增加,性能会下降,但下降并不是线性的
- 选择正确的数据库,正确的配置
1.4 各存储引擎之间的比较
- MySQL会提供一个用来演示MySQL各项功能的示例数据库
1.5 连接MySQL
- 连接MySQL操作是一个连接进程和MySQL数据库实例进行通信
- 从程序设计的角度来说,本质上是进程通信
1.5.1 TCP/IP
- TCP/IP套接字方式是MySQL数据库在任何平台下都提供的连接方式,也是网络中使用最多的一种方式
- 该方式在TCP/IP连接上建立一个基于网络的连接请求
- 通常情况下,客户端在一台服务器上,MySQL实例在另一台服务器上,这两台机器通过一个TCP/IP网络连接
1.5.2 命名管道和共享内存
- 在Windows平台上,如果两个需要进程通信的进程在同一台服务器上,可以使用命名管道
1.5.3 UNIX域套接字
- 在Linux和UNIX环境下,可以使用UNIX域套接字
- UNIX域套接字并不是网络协议,只能在MySQL客户端和数据库实例在一台服务区上的情况下使用