在使用Impala这种所谓大数据引擎的时候,总会感觉有些地方设计的不是那么尽善尽美,比如说缓存,Impala的查询结果是没有经过缓存的,也就是说每次都相当于需要重新对文件执行一遍查询。 感觉MySQL这种优秀的关系型数据库还不是很深入的了解,有点罪过,趁着周末补一些 稍微整理一点MySQL架构相关的的知识点。自己用visio画一个书上的图贴出来。 MySQL基本架构 如下图,是MySQL的逻辑架构图:
下面挑几个模块解释一下: 1.解析器 SQL命令传递到解析器的时候会被解析器验证和解析。解析器是由Lex和YACC实现的,是一个很长的脚本。 主要功能:
2.优化器 SQL语句在查询之前会使用查询优化器对查询进行优化。他使用的是“选取-投影-联接”策略进行查询。 用一个例子就可以理解:select uid,name from user where gender = 1; 这个select 查询先根据where 语句进行选取,而不是先将表全部查询出来以后再进行gender过滤 这个select查询先根据uid和name进行属性投影,而不是将属性全部取出以后再进行过滤 将这两个查询条件联接起来生成最终查询结果。 3.缓存 如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。 这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等。 补充知识 1.查询优化和执行(Optimization and Execution) MySQL将用户的查询语句进行解析,并创建一个内部的数据结构——分析树,然后进行各种优化,例如重写查询、选择读取表的顺序,以及使用哪个索引等。 查询优化器不关心一个表所使用的存储引擎,但是存储引擎会影响服务器如何优化查询。优化器通过存储引擎获取一些参数、某个操作的执行代价、以及统计信息等。在解析查询之前,服务器会先访问查询缓存(query cache)——它存储SELECT语句以及相应的查询结果集。如果某个查询结果已经位于缓存中,服务器就不会再对查询进行解析、优化、以及执行。它仅仅将缓存中的结果返回给用户即可,这将大大提高系统的性能。 2.并发控制(锁粒度) MySQL提供两个级别的并发控制:服务器级(the server level)和存储引擎级(the storage engine level)。加锁是实现并发控制的基本方法,MySQL中锁的粒度:
另外,值得一提的是,MySQL的一些存储引擎(如InnoDB、BDB)除了使用封锁机制外,还同时结合MVCC机制,即多版本两阶段封锁协议(Multiversion two-phrase locking protocal),来实现事务的并发控制,从而使得只读事务不用等待锁,提高了事务的并发性。 注意: 行级锁只在存储引擎层实现,而MySQL服务器层没有实现。服务器层完全不了解存储引种的锁实现。 3.事务 MySQL中,InnoDB和BDB都支持事务处理。这里主要讨论InnoDB的事务处理。 事务的ACID特性: 事务是由一组SQL语句组成的逻辑处理单元,事务具有以下4个属性,通常简称为事务的ACID属性。
事务处理带来的相关问题: 由于事务的并发执行,带来以下一些著名的问题:
End 视频:大数据到底是什么 都说干大数据挣钱 1分钟告诉你都在干什么 “讲述大数据在金融、电信、工业、商业、电子商务、网络游戏、移动互联网等多个领域的应用,以中立、客观、专业、可信赖的态度,多层次、多维度地影响着最广泛的大数据人群 36大数据 |
|