一、MySQL数据库特性
1. 内部构件和可移植性
使用C和C++编写,保证了源代码的可移植性。
支持多种平台。
提供众多编程语言的API接口。
采用核心线程和完全多线程(使用多CPU)。
提供事务性和非事务性存储引擎。
使用极快的”B树”磁盘表和索引压缩。
极快的基于线程的内存分配系统。
提供TCP/IP、ODBC和JDBC等多种数据库连接途径。
存储器中的哈希表用作临时表。
SQL函数使用高度优化的类库实现。
支持插件式存储引擎。
2. 众多列类型
FLOAT,DOUBLE,CHAR,VARCHAR,TEXT,BLOB,DATE,TIME,DATETIME,TIMESTAMP,YEAR,SET,ENUM,以及OpenGIS空间类型
3. 语句和函数
按照标准SQL支持表别名和列别名,提供完整的操作符和函数支持。
4. 安全
十分灵活和安全的权限和密码系统,允许基于主机的验证。连接到服务器时,所有的密码传输均采用加密形式,从而保证了密码安全
5. 可伸缩和限制
处理大型数据库: 我们使用了MySQL服务器和含5千万条记录的数据库。我们还听说,有些用户将MySQL用于含60000个表和约50亿行的数据库。
每个表可支持高达64条索引;每条索引可由1~16个列或列元素组成。最大索引宽度为1000字节索引可使用具备CHAR、VARCHAR、BLOB或TEXT列类型的列前缀。
6. 本地化
支持众多字符集并提供unicode支持
7. 提供丰富的客户端工具
等等…
二、MySQL体系结构
MySQL是一种关系数据库产品。关系数据库,顾名思义,是建立在关系模型基础上的数据库。现实世界中,实体与实体之间的各种联系一般都可以用关系模型来表示。经过数十年的发展,关系数据库在理论和工业实践中都已经很成熟了。
对于MySQL,可以理解为如下的3个层次。
- 应用层
负责和客户端、用户进行交互,需要和不同的客户端和中间服务器进行交互,建立连接,记住连接的状态,响应它们的请求,返回数据和控制信息(错误信息、状态码等)。
- 逻辑层
负责具体的查询处理、事务管理、存储管理、恢复管理,以及其他的附加功能。查询处理器负责查询的解析、执行。当接收到客户端的查询时,数据库就会分配一个线程来处理它。先由查询处理器(优化器)生成执行计划,然后交库就会分配一个线程来处理它。先由查询处理器(优化器)生成执行计划,然后交由计划执行器来执行,执行器有时需要访问更底层的事务管理器、存储管理器来操作数据,事务管理器、存储管理器主要负责事务管理、并发控制、存储管理。这其中,将由事务管理器来确保“ACID”特性,通过锁管理器来控制并发,由日志管理器来确保数据持久化,存储管理器一般还包括一个缓冲管理器,由它来确定磁盘和内存缓冲之间的数据传输。
- 物理层
实际物理磁盘(存储)上的数据库文件,比如,数据文件、日志文件等。
下图是MySQL官方文档的一个基础架构图,其中Connectors可以理解为各种客户端、应用服务;Connection Pool可以理解为应用层,负责连接、验证等功能;Management Services&Utilities、SQL Interface、Parser、Optimizer、Caches&Buffers、Pluggable Storage Engines可以理解为数据库的大脑——逻辑层;最下方的Files&Logs可以理解为物理层。
阐述一下各个组件:
connectors
用户通过本地或网络使用C、PHP等多种语言开发的接口连接MySQL数据库服务器进行交互。
connection pool
客户端认证、线程重用、连接数限制、内存检查、缓存。
management services & utilities
系统管理和控制工具,如备份与恢复、复制、集群、分区管理、数据模板管理等。
SQL interface
接受用户sql命令并且返回用户需要查询的结构;关系型数据库的基本抽象。
Parser
SQL命令传递到解析器的时候会被解析器验证和解析;其主要功能有将sql语句分解成数据结构、并将这个结构传递到后续步骤;如果在分解构成中遇到错误那么就说明这个sql语句是不合理的,语句将不会继续执行下去。
optimizer
SQL语句在查询之前会使用查询优化器对查询进行优化(产生多种执行计划,最终数据库会选择最优化的方案去执行,尽快返会结果) 他使用的是“选取-投影-联接”策略进行查询。
cache & buffer
如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等;buffer是缓冲、cache是缓存。
缓存在第一次查询后,MySQL便将查询语句以及查询结果进行hash处理并保留在缓存中,SQL查询到达之后,对其进行同样的hash处理后,将两个hash值进行对照,如果一样,则命中,从缓存中返回查询结果;否则,需要整个流程走一遍
engine
存储引擎是MySQL中具体的与文件打交道的子系统,也是MySQL最具有特色的一个地方。MySQL的存储引擎是插件式的。它根据MySQL AB公司提供的文件访问层的一个抽象接口来定制一种文件访问机制(这种访问机制就叫存储引擎)。存储引擎是基于表的而不是数据库的。
常见存储引擎有:Myisam、innobd、xtradb、memory、merge、csv等,后面会详细介绍。
MySQL工作机制流程图:
三、MySQL数据库与实例
在数据库领域中,数据库与实例这两个词很容易混淆,下面说说这两个词的定义:
- 数据库
这概念上来说,数据库是物理操作系统文件或其他形式文件类型的集合,在MySQL数据库中,数据库文件可以使.frm、.MYD、.MYI、.ibd结尾的文件。当使用NDB引擎时,数据库的文件可能不是操作系统上的了,而是在内存中,但是定义仍然不变。
- 实例
MySQL由后台线程以及一个共享内存区组成。共享内存可以被运行的后台线程所共享。需要牢记的是,数据库实例才是真正用于操作数据库文件的。数据库实例是程序,是真正的数据库管理软件。
一般这两个词也可以互换使用,不过两者的概念完全不同。在MySQL数据库中,实例与数据库的关系通常是一一对应的,即一个实例对应一个数据库,一个数据库对应一个实例。但是也可以存在一个数据库多个实例的情况,但使用的套接字不能相同即可。
MySQL被设计为一个单进程多线程的数据库架构,同Oracle数据库和SQL Server等大型数据库系统类似(与Oracle有一些区别),这样就是说,MySQL数据库实例在系统上的表现就是一个进程。
PS:MySQL数据库是开放源代码的关系型数据库。目前,它可以提供的功能有:支持sql语言、子查询、存储过程、触发器、视图、索引、事务、锁、外键约束和影像复制等。在后期,会详细讲解这些功能。