时不待我 天道酬勤

没有多少时间可以虚度了....

导航

[转]MySQL逻辑架构(MySQL’s Logical Architecture)

Posted on 2011-07-04 23:01  jadesun  阅读(528)  评论(0编辑  收藏  举报

MySQL逻辑架构(MySQL’s Logical Architecture)

一个好的图片会是你更容易理解MySQL各个组件的工作方式。看图


src=http://xiayuanfeng.javaeye.com/upload/attachment/109565/2baf4ab1-943f-3848-ba7a-e7af33b172f1.jpg

最上一层所包含的服务并不是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(计划中)