1、 一个由多个子系统构成的层次化系统 Connectors:用来与客户端应用程序建立连接的数据库接口 Management Services&Utilities:系统管理和服务控制相关的辅助工具 Connection Pool:负责处理与用户访问有关的各种用户登录、线程处理、内存和进程缓存需求 Sql Interface:提供从用户接受命令并把结果返回给用户的机制Parser:对SQL语句进行语法分析和解析,构造一个月来执行查询的数据结构 Optimizer:优化查询语句,以保证数据检索动作的效率达到或者非常接近最最优。使用一种“选取-投影-联结”策略来处理查询,即先根据有关的限制条件进行选取(
2、Select 操作)以减少将要处理的元组个数,再进行投影以减少被选取元组力的属性字段的个数,最后根据连接条件生产最终的查询结果 Caches&Buffers:保证使用频率最高的数据或结构能够以最有效率的方式被访问,缓存的类型有:表缓存、记录缓存、键缓存、权限缓存、主机名缓存等。最与众不同的特点是插件式存储引擎 插件式表存储引擎是底层物理结构的实现,负责为数据库执行实际的数据I/O操作,它是基于表而不是数据库的。可以根据实际应用需求为每个表设定不同的选择。插件式存储引擎的核心是文件访问层的一个抽象接口,任何人都可以利用这个API接口去建立新的文件访问机制 技术关键点 InnoDB MyISAM
3、NDB Memory Archive Maria 其他 综合比较 并发性:锁粒度 事务支持:ACID 引用完整性:外键支持 物理存储:表与索引等文件格式 索引支持:索引策略与方法 内存高速缓冲:缓存和缓冲区策略 其他目标特性:安全限制等 支持事务 行锁设计,提供并发性,同时支持MVCC MVCC多版本并发控制 支持外键,以确保数据完整性 独立的ibd文件存储表结构和数据 其他特性:插入缓冲、二次写、自适应哈希索引、预读等高性能和高可用功能 适用场合:强调可靠性和需要支持事务处理 名词解释 插入缓冲 二次写 自适应哈希索引 MVCC多版本并发控制 一致性非锁定读 不支持事务 表锁设计 全文索引
4、存储表由MYD和MYI组成,分别存放数据和索引 使用数据压缩和索引优化 特点:可靠性高、适用范围广、检索速度快 适用场合:强调数据检索速度 Network database,一种集群存储引擎 采用share nothing 集群架构 每个节点都拥有自己的内存和磁盘 特点:数据全部放在内存中,主键查询速度快 增加NDB存储节点,可线性提高性能 Join连接的网络开销大 对RAM需求大 适用场合:冗余、高可用性、负载均衡 MySQL NDB cluster 架构图http:/ 将表中数据存放在内存中 默认使用哈希索引 由一个.frm的扩展名来指明它存储的表定义 特点:服务器重启时,Memory表里
5、的数据全部丢失 只支持表锁,并发性能差 不支持TEXT和BLOB类型 按照定常方式存储变长字段(varchar)数据 高速度,低延迟,不适合频繁写 适用场合:存储临时数据、数据仓库的纬度表 行锁机制更好的支持多线程多用户并发 更好的支持读写混合语句以及扩展 可选择磁盘存储介质永久保存数据 Shared-nothing和分布式架构保证无单点故障,99.999%可用性 数据自动分布在各个节点,应用开发者无需考虑分区或分片解决方案 支持MEMORY中不支持的变长数据类型(包括BLOB 和 TEXT)目标:提供高速的插入和压缩功能 特点:只支持Insert和Select操作 支持行锁来实现高并发的插入
6、操作 不支持事务 采用zlib算法压缩存储,压缩比例达1:10 适用场合:存储归档数据,如日志信息 目标:取代原有的MyISAM存储引擎 特点:缓存数据和索引文件 行锁设计 提供MVCC功能 支持事务和非事务安全 Federated Merge CSV Sphinx Infobright 概述及体系架构 master thread 关键特性 由Innobase Oy公司开发(2006被Oracle收购)第一个完整支持ACID事务的MySQL存储引擎 行锁设计 支持MVCC 支持外键 一致性非锁定读 应用广泛:Yahoo、Facebook、Youtube、Flickr、Wow、SecondLif
7、e 后台线程IO线程、master 线程、锁监控线程、错误监控线程 内存池缓冲池、重做日志缓冲池、额外内存池 内存结构缓冲池:存放各种数据缓存,将数据库文件按页读取,LRU算法维护缓存,定时flush脏页到文件日志缓冲:将重做日志信息先放入这个缓冲区,然后按一定频率将其刷新到重做日志文件额外内存池:对一些数据结构本身信息的内存分配 master thread的线程优先级别最高。组成:主循环(loop)、后台循环(background loop)、刷新循环(flush loop)、暂停循环(suspend loop)。loop循环伪代码:void master_thread()loop:for(
8、int i=0;i 10;i+)do thing once per second /每1秒操作 sleep 1 second if necessary do things once per ten seconds /每10秒操作background loop:do something goto loop;每1秒操作:日志缓冲刷新到磁盘,即使这个事务还没有提交(总是)。合并插入缓冲(可能)。至多刷新100个InnoDB的缓冲池中的脏页到磁盘(可能)。如果当前没有用户活动,切换到background loop(可能)。伪代码:do log buffer flush to disk if(last_
9、one_second_ios innodb_max_dirty_pages_pct)do buffer pool flush 100 dirty page if(no user activity)goto backgroud loop 每10秒操作:刷新100个脏页到磁盘(可能)。合并至多5个插入缓冲(总是)。将日志缓冲刷新到磁盘(总是)。删除无用的Undo页(总是)。刷新100个或者10个脏页到磁盘(总是)。产生一个检查点(总是)。伪代码:if(last_ten_second_ios 70%)do buffer pool flush 100 dirty page else do buffer
10、 pool flush 10 dirty page do fuzzy checkpoint backgroud loop:删除无用的Undo页(总是)。合并20个插入缓冲(总是)。跳回到主循环(可能)。跳转到flush loop(可能)。伪代码:do full purge do merge 20 insert buffer if not idle:goto loopelse:goto flush loop flush loop&suspend_loop:flush loop不断刷新100个页,直到符合条件。如果flush loop无事可做,将会切换到suspend_loop,suspend_l
11、oop将master thread挂起,等待事件的发生 伪代码:flush loop:do buffer pool flush 100 dirty page if(buf_get_modified_ratio_pct innodb_max_dirty_pages_pct)goto flush loop goto suspend loop suspend loop:suspend_thread()waiting event goto loop;插入缓冲 两次写 自适应哈希索引 一致性非锁定读 MVCC(多版本并发控制)插入缓冲 聚集索引主键、第一个非空的唯一索引、ROWID插入聚集索引是按顺序的
12、,不需随机读取磁盘 辅助索引索引不唯一数据页按序插入,插入索引需离散访问索引页,效率低 插入缓冲为了提高辅助索引的插入和修改性能先判断是否在缓冲池,如果在,则直接插入索引页,否则将先插入缓冲池,然后定期合并插入索引页 两次写Doublewrite:内存doublewrite Buffer(2M)和物理磁盘上共享表空间(连续页)MVCC(多版本并发控制)基本原理:在事务中保存数据的快照,这意味着在一个事务里能够看到数据一致的视图,而不用担心这个事务运行多长时间,同时也意味着在同一个时刻不同事务看到的相同表里的数据可能是不同的。基本特征:每行数据都存在一个版本,每次数据更新时都更新该版本,修改时C
13、opy出当前版本随意修改,各事务之间无干扰,保存时比较版本号,如果成功(commit),则覆盖原记录;失败则放弃copy(rollback)一致性非锁定读指innodb通过行多版本控制技术的方式来读取数据库中的数据,如果读取的数据正在进行删除或者更新,这时读取操作不会因此等待行上的锁释放,而会去读取行的一个快照(快照指的是该行之前的版本的数据),快照没有额外的开销且读取快照不需要加锁大大提高了数据读取的并发性,在innodb中,只是默认的方式,即读取不会占用和等待表上的锁在事务不同的隔离级别下,读取方式还是有所不同的,并不是每一个隔离级别下读取都是一致性的读ThanksEmail:Popo:frankie_Msn :