当前位置: 首页 > 科技观察

MySQL设计架构

时间:2023-03-12 09:20:22 科技观察

在使用号称大数据引擎Impala的时候,总觉得有些地方设计的不是那么完美,比如缓存。Impala的查询结果是不缓存的,也就是说每次都是相当的,因为需要重新对文件执行查询。MySQL的基本架构如下图所示,是MySQL的逻辑架构图:顶层服务并不是MySQL独有的,大多数基于网络的客户端/服务器工具或服务都有类似的架构,比如连接处理、授权和认证、安全等。第二层架构是MySQL比较有趣的部分。MySQL的大部分核心服务功能都在这一层。包括查询解析、分析、优化、缓存以及所有内置功能,所有跨存储引擎的功能都在这一层实现:存储过程、触发器、视图等。第三层包含存储引擎。存储引擎负责MySQL中数据的存储和提取。与GNU/Linux下的各种文件系统一样,每一种存储引擎都有其优缺点。服务器通过API与存储引擎通信。这些接口屏蔽了不同存储引擎之间的差异。下面分几个模块来解释一下:1.Parser当SQL命令传给parser时,会被parser校验和解析。解析器由Lex和YACC实现,是一个很长的脚本。主要功能:将SQL语句分解成一个数据结构,并将这个结构传递给后续的步骤。SQL语句的传递和处理都会基于这个结构。如果分解遇到错误,说明sql语句不合理2.优化器SQL语句在查询前会使用查询优化器对查询进行优化。他正在使用“select-projection-join”策略进行查询。可以举个例子来理解:selectuid,namefromuserwheregender=1;这个select查询是先根据where语句进行选择,而不是先查询所有表再按性别筛选。这个select查询是先根据uid和name属性进行投影,而不是把所有的属性都取出来再过滤,把两个查询条件结合起来,生成最终的查询结果。3.缓存如果查询缓存中有命中的查询结果,查询语句可以直接从查询缓存中取数据。这种缓存机制是由一系列的小缓存组成的。如表缓存、记录缓存、键缓存、权限缓存等。补充知识1.查询优化和执行(OptimizationandExecution)MySQL解析用户的查询语句,并创建一个内部数据结构——分析树,然后进行各种优化,如重写查询、选择和读取表顺序、以及使用哪个索引等。查询优化器不关心表使用的存储引擎,但存储引擎会影响服务器如何优化查询。优化器通过存储引擎获取一些参数,一个操作的执行成本,以及统计信息。在解析查询之前,服务器会先访问查询缓存(querycache)——里面存储了SELECT语句和对应的查询结果集。如果查询结果已经在缓存中,服务器将不再解析、优化和执行该查询。它只将缓存中的结果返回给用户,这将大大提高系统的性能。2.并发控制(锁粒度)MySQL提供了两个级别的并发控制:服务器级(serverlevel)和存储引擎级(storageenginelevel)。加锁是实现并发控制的基本方法。MySQL中锁的粒度:表级锁:MySQL独立于存储引擎提供表锁。例如,对于ALTERTABLE语句,服务器提供表级锁。行级锁:InnoDB和Falcon存储引擎提供行级锁。另外,BDB支持页级锁。InnoDB的并发控制机制将在下一节详细讨论。另外,值得一提的是,MySQL的一些存储引擎(如InnoDB、BDB)除了使用锁机制外,还结合了MVCC机制,即多版本二段锁协议(Multiversiontwo-phrase锁定协议)来实现交易。并发控制,让只读事务不需要等待锁,提高事务的并发性。注意:行级锁只在存储引擎层实现,不在MySQL服务器层实现。服务器层完全不知道存储引入的锁实现。3、事务在MySQL中,InnoDB和BDB都支持事务处理。这里主要讨论InnoDB的事务处理。事务的ACID特性:事务是由一组SQL语句组成的逻辑处理单元。事务具有以下四个属性,通常称为事务的ACID属性。原子性:事务是一个原子操作单元,它对数据的修改要么全部执行,要么根本不执行。一致:当事务开始和完成时,数据必须保持一致状态。这意味着所有相关的数据规则必须应用于交易的修改以保持数据完整性;当事务结束时,所有内部数据结构(例如B树索引或双向链表)也必须正确。隔离性:数据库系统提供一定的隔离机制,保证事务在一个“独立”的环境中执行,不受外部并发操作的影响。这意味着交易过程中的中间状态对外界是不可见的,反之亦然。持久性(Durable):事务完成后,其对数据的修改是永久性的,即使发生系统故障也能保持。事务处理带来的相关问题:由于事务的并发执行,带来了以下一些众所周知的问题:更新丢失:当两个或多个事务选择同一行,然后根据原来的更新行selectedvalue,由于每个事务都不知道其他事务的存在,所以会出现更新丢失的问题——最后一次更新会覆盖其他事务所做的更新。脏读:一个事务正在修改一条记录。在事务完成提交之前,这条记录的数据处于不一致状态;这时,另一个事务也读取了同一条记录。如果没有添加控件,则第二个事务读取“脏”数据并根据它进行进一步处理,导致未提交的数据依赖。这种现象被形象地称为“脏读”。不可重复读(Non-RepeatableReads):一个事务在读取了一些数据后,在某个时间再次读取之前读取的数据,但是发现读取的数据发生了变化,或者某些记录发生了变化。删除!这种现象称为“不可重复读”。幻读:一个事务按照相同的查询条件重新读取之前检索到的数据,却发现其他事务插入了满足其查询条件的新数据。这种现象称为“幻读”。