[转]MySQL逻辑架构(MySQL’s Logical Architecture)
Posted on 2011-07-04 23:01 jadesun 阅读(528) 评论(0) 编辑 收藏 举报MySQL逻辑架构(MySQL’s Logical Architecture)
一个好的图片会是你更容易理解MySQL各个组件的工作方式。看图
最上一层所包含的服务并不是MySQL所独有的技术。它们都是服务于C/S程序或者是这些程序所需要的:连接处理,身份验证,安全性等等。
第二层是我们所感兴趣的。这是MySQL的核心部分。包括了查询的解析,分析,优化,缓存以及所有内置的函数(如日期,时间,数学运算,加密)。还有一些功能是涉及到了存储引擎,如存储过程,触发器,视图等。
第三层包括了存储过程。它们负责存储和获取所有存储在MySQL中的数据。就像Linux众多的文件系统一样。每个存储引擎都有自己的优点和缺陷。服务器是通过存储引擎API来与它们交互的。这个接口隐藏了各个存储引擎不同的地方。对于查询层尽可能的透明。这个API包含了很多底层的操作。如开始一个事物,或者取出有特定主键的行。存储引擎不能解析SQL,互相之间也不能通信。仅仅是简单的响应服务器的请求。
连接管理和安全
在服务器内部,每个client连接都有自己的线程。这个连接的查询都在一个单独的线程中执行。这个线程存在于一个核心或者CPU中。服务器缓存了线程,因此不需要为每个client连接单独创建和销毁线程。
当clients(也就是应用程序)连接到了MySQL服务器。服务器需要对它进行身份验证。这个身份验证是基于用户名,主机,以及密码。也使用了X.509的SSL连接。clients一连接上,服务器就验证它的权限。如这个client是否可以查询world数据库下的Country表的数据。这部分将在独立的章节进行说明。
优化和执行
MySQL的解析查询是创建了一个内部的结构(一个语法分析树)。之后就进行了各种各样的优化。这些优化包括了,查询语句的重写,读表的顺序,索引的选择等等。你可以通过查询语句的关键词对优化器进行一定的提示。这样做会影响到它的优化方式。你也可以让服务器对于各种优化进行说明。这样可以得知服务器的运行策略以及为了获得更好的效率,可以做更多的优化工作,如查询优化等。优化器会在以后的教程中详细介绍。
优化器是不会关心表所用到的存储引擎的类型,但是存储引擎会影响到服务器优化查询的方式。优化器需要知道存储引擎的一些特性,这些操作的消耗以及表数据的一些统计信息。例如,一些存储引擎支持索引,这对于查询是非常有用的。
在解析查询之前,要查询缓存,这个缓存只能保存查询信息以及结果数据。如果请求一个查询在缓存中存在,就不需要解析,优化和执行查询了。直接返回缓存中所存放的这个查询的结果。以后的章节会详细讲到。
MyISAM
MyISAM是MySQL默认的存储引擎。MyISAM在性能和特性上提供了一个很好的折中的解决办法。特性有,全文索引,压缩,GIS函数。MyISAM并不支持事物和行锁。
存储
MyISAM把表存储在两个文件中。一个数据文件,一个索引文件。扩展名为.MYD和.MYI。MyISAM的格式是平台独立的。意思就是你可以把这两个文件拷贝在任意的平台上。
MyISAM可以包含动态或静态列。MySQL根据表的定义来决定使用哪种格式。MyISAM表的行数限制在于,硬盘空间和操作系统所允许存在的最大文件。
MyISAM表在MySQL5.0中,默认的是动态长度的行,以及可操作256TB数据,使用6字节的指针指向数据记录。早期的MySQL默认指针为4字节,支持4GB的数据。所有的MySQL版本支持的指针大小上限为8字节。为了改变MyISAM表的指针大小,你必须指定MAX_ROWS,AVG_ROW_LENGTH的值。这两个数据指出了你所需要空间的总数。
CREATE TABLE mytable (
a INTEGER NOT NULL PRIMARY KEY,
b CHAR(18) NOT NULL
) MAX_ROWS = 1000000000 AVG_ROW_LENGTH = 32;
这个例子中,我们告诉MySQL对这个表分配空间至少是32G。看看MySQL到底分配了多少。我们来看看。
mysql> SHOW TABLE STATUS LIKE 'mytable' \G
*************************** 1. row ***************************
Name: mytable
Engine: MyISAM
Row_format: Fixed
Rows: 0
Avg_row_length: 0
Data_length: 0
Max_data_length: 98784247807
Index_length: 1024
Data_free: 0
Auto_increment: NULL
Create_time: 2002-02-24 17:36:57
Update_time: 2002-02-24 17:36:57
Check_time: NULL
Create_options: max_rows=1000000000 avg_row_length=32
Comment:
1 row in set (0.05 sec)
我们看到了Create_options的值,是我们所设置的。也看到了Max_data_length的值接近了91GB。你可以通过ALTER TABLE 语句来修改指针的大小。但是这样的操作会使整个表和它的索引重写。会花费大量的时间。
MyISAM 特性
做为老牌的MySQL引擎。MyISAM有很多好的特性。这些特性已经被开发了很多年。已经能满足工作需要。
锁和并发
MyISAM锁定了整张表,而不是行。读取程序能获得将要读取的表的读锁。写入程序获得写锁。然而,当查询语句执行的时候,仍然可以插入新的数据。(并发插入)。这个是非常有用的特性。
自动修复
MySQL支持自动检测和修复MyISAM类型的表。
手动修复
你可以使用CHECK TABLE和REPAIR TABLE命令来检测表的错误和修复错误。当服务器停止的时候,你可以使用myisamchk命令行工具去检查和修复表。
索引特性
在MyISAM表中,你可以给第一个500字符的BLOB和TEXT列加上索引,MyISAM支持全文索引。为了复杂的查询,索引了单独的词。在以后会详细介绍索引。
健写入延迟
MyISAM表标有DELAY_KEY_WRITE的创建选项。意思是在一个语句结束后,不会把更改的索引写入到硬盘上。而是MyISAM在内存中缓存了更该。当它精简缓冲区或者关闭表的时候,就会把缓存的索引块写入到硬盘。对于一个频繁更新的表,会有很大的性能提升。然而,在服务器或系统挂掉的时候,索引也会被破坏,并且需要去修复它。你可以在服务器启动之前,用myisamchk去检测并修复。或者使用自动修复的选项。(即使你不使用DELAY_KEY_WRITE这个特性,这个个也是个很好的安全方案)。你可以全局的配置DELAY_KEY_WRITE。也可以给单独的表进行配置。
压缩的MyISAM表
举个例子吧,在基于CD-ROM或者DVD-ROM的应用程序以及其他的嵌入式环境。一旦这些表被建立就不会修改以及填满了数据。这些表就非常适合被压缩。
你可以使用myisampack工具去压缩表。你不能更改压缩表(虽然你可以解压缩,修改,重新压缩),但是这种表能节省大量的硬盘空间。也可以提高性能,因为这种表小,需要的硬盘空间也很少,也就能快速的查找记录了。压缩表可以有索引,但是它们仅仅是只读的。
对解压缩的数据进行读取,对于大多数现代的硬件来说都是可以忽略不计的。压缩的真正的好处是在于降低了硬盘的I/O.行可以单独的压缩,因此MySQL没有必要解压缩整个表,仅仅提取一行就可以了。
MyISAM Merge Engine
Merge引擎是MyISAM的变种。一个Merge表是许多相同的MyISAM表整合到一个虚表中。这点比较适合把MySQL应用在日志和数据仓库的应用中。
存储引擎总结
下面的图表总结了MySQL流行的存储引擎的事物和锁相关的特性。MySQL版本的那一列给出了要使用引擎的最低版本,对于一些引擎和MySQL版本你可能要自己编译服务器。这一列All值的意思就是高于MYSQL3.23的所有版本。
存储引擎 | MySQL版本 | 事物 | 锁的颗粒度 | 关键的应用 | 禁忌 |
MyISAM | All | No | 表,并发插入 | SELECT,INSERT,大批量读取 | 混合读写 |
MyISAM Merge | All | No | 表,并发插入 | 分段存储,数据仓库 | 过的全局查找 |
Memory(HEAP) | All | No | 表 | 中间计算,静态查找数据 | 大数据集,持久性 |
InnoDB | All | Yes | 行级,MVCC | 事物处理 | 没有 |
Falcon | 6.0 | Yes | 行级,MVCC | 事务处理 | 没有 |
Archive | 4.1 | Yes | 行级,MVCC | 日志,聚合分析 | 随机存取,更新,删除 |
CSV | 4.1 | No | 表 | 日志,外部数据的大批量读取 | 随机存取,索引 |
Blackhole | 4.1 | Yes | 行级,MVCC | 记录或者复制归档 | 除了指定用途 |
Federated | 5.0 | N/A | N/A | 分布式数据源 | 除了指定用途 |
NDB Cluster | 5.0 | Yes | 行级 | 高可用性 | 典型的用途 |
PBXT | 5.0 | Yes | 行级,MVCC | 事务处理,日志 | 集群索引 |
soildDB | 5.0 | Yes | 行级,MVCC | 事务处理 | 没有 |
Maria(计划中) |