在应用Impala这种所谓大年夜数据引擎的时刻,总会感到有些处所设计的不是那么精细绝伦,比如说缓存,Impala的萌芽结不雅是没有经由缓存的,也就是说每次都相当于须要从新对文件履行一遍萌芽。
MySQL根本架构如下图,是MySQL的逻辑架构图:
将SQL语句分化成数据构造,并将这个构造传递到后续步调,今后SQL语句的传递和处理就是基于这个构造的
下面挑几个模块解释一下:
1.解析器
SQL敕令传递到解析器的时刻会被解析器验证和解析。解析器是由Lex和YACC实现的,是一个很长的脚本。
重要功能:
SQL语句在萌芽之前会应用萌芽优化器对萌芽进行优化。他应用的是“拔取-投影-联接”策略进行萌芽。
用一个例子就可以懂得:select uid,name from user where gender = 1;
这个select 萌芽先根据where 语句进行拔取,而不是先将表全部萌芽出来今后再进行gender过滤
这个select萌芽先根据uid和name进行属性投影,而不是将属性全部掏出今后再进行过滤
将这两个萌芽前提联接起来生成最终萌芽结不雅。
3.缓存
如不雅萌芽缓存有射中的萌芽结不雅,萌芽语句就可以直接去萌芽缓存中取数据。
- 最上层的办事并不是MySQL所独有的,大年夜多半基于收集的客户端/办事器的对象或者办事都有类似的架构,比如连接处理、授权认证、安然等等。
- 第二层架构是MySQL比较有意思的部分大年夜多半MySQL的核心办事功能都在这一层。包含萌芽解析、分析、优化、缓存以及所有的内置函数,所有跨存储引擎的功能都在这一层实现:存储过程、触发器、视图等。
- 第三层包含了存储引擎。存储引擎负责MySQL中数据的存储和提取。和GNU/Linux下的各类文件系同一样,每个存储引擎都有它的优势和劣势。办事器经由过程API与存储引擎进行通信。这些接口樊篱了不合存储引擎之间的差别。
这个缓存机制是由一系列小缓存构成的。比如表缓存,记录缓存,key缓存,权限缓存等。
2.优化器
弥补常识
1.萌芽优化和履行(Optimization and Execution)
MySQL将用户的萌芽语句进行解析,并创建一个内部的数据构造——分析树,然落后行各类优化,例如重写萌芽、选择攫取表的次序,以及应用哪个索引等。
萌芽优化器不关怀一个表所应用的存储引擎,然则存储引擎会影响办事器若何优化萌芽。优化器经由过程存储引擎获取一些参数、某个操作的履行价值、以及统计信息等。在解析萌芽之前,办事器会先拜访萌芽缓存(query cache)——它存储SELECT语句以及响应的萌芽结不雅集。如不雅某个萌芽结不雅已经位于缓存中,办事器就不会再对萌芽进行解析、优化、以及履行。它仅仅精华存中的结不雅返回给用户即可,这将大年夜大年夜进步体系的机能。
2.并发控制(锁粒度)
MySQL供给两个级其余并发控制:办事器级(the server level)和存储引擎级(the storage engine level)。加锁是实现并发控制的根本办法,MySQL中锁的粒度:
表级锁:MySQL自力于存储引擎供给表锁,例如,对于ALTER TABLE语句,办事器供给表锁(table-level lock)。
行级锁:InnoDB和Falcon存储引擎供给行级锁,此外,BDB支撑页级锁。InnoDB的并发控制机制,下节具体评论辩论。
别的,值得一提的是,MySQL的一些存储引擎(如InnoDB、BDB)除了应用封锁机制外,还同时结合MVCC机制,即多版本两阶段封锁协定(Multiversion two-phrase locking protocal),来实现事务的并发控制,大年夜而使得只读事务不消等待锁,进步了事务的并发性。
留意: 行级锁只在存储引擎层实现,而MySQL办事器层没有实现。办事器层完全不懂得存储引种的锁实现。
3.事务
MySQL中,InnoDB和BDB都支撑事务处理。这里重要评论辩论InnoDB的事务处理。
如不雅在分化构成中碰到缺点,那么就解释这个sql语句是不合理的
事务的ACID特点:
- 事务是由一组SQL语句构成的逻辑处理单位,事务具有以下4个属性,平日简称为事务的ACID属性。
- 原子性(Atomicity):事务是一个原子操作单位,其对数据的修改,要么全都履行,要么全都不履行。
- 一致性(Consistent):在事务开端和完成时,数据都必须保持一致状况。这意味着所有相干的数据规矩都必须应用于事务的修改,以保持数据的完全性;事务停止时,所有的内部数据构造(如B树索引或双向链表)也都必须是精确的。
- 隔离性(Isolation):数据库体系供给必定的隔离机制,包管事务在不受外部并发操作影响的“自力”情况履行。这意味着事务处理过程中的中心状况对外部是弗成见的,反之亦然。
- 持久性(Durable):事务完成之后,它对于数据的修改是永远性的,即使出现体系故障也可以或许保持。
事务处理带来的相干问题:
- 因为事务的并发履行,带来以下一些有名的问题:
- 更新损掉(Lost Update):当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,因为每个事务都不知道其他事务的存在,就会产生损掉更新问题--最后的更新覆盖了由其他事务所做的更新。
- 脏读(Dirty Reads):一个事务正在对一笔记录做修改,在这个事务完成并提交前,这笔记录的数据就处于不一致状况;这时,另一个事务也来攫取同一笔记录,如不雅不加控制,第二个事务攫取了这些“脏”数据,并据此做进一步的处理,就会产生未提交的数据依附关系。这种现象被形象地叫做”脏读”。
- 弗成反复读(Non-Repeatable Reads):一个事务在攫取某些数据后的某个时光,再次攫取以前读过的数据,却发明其读出的数据已经产生了改变、或某些记录已经被删除了!这种现象就叫做“弗成反复读”。
推荐阅读
机器学习和深度学习是怎么一回事?Faizan Shaikh来帮你解答
摘要: 本文以浅近易懂的说话介绍了机械进修和深度进修的定义及应用,以及在源数据请求,硬件支撑,特点工程、问题解决方法、履行时光及可解释性等方面的差别,对于新手入门有很大年夜启发>>>详细阅读
本文标题:MySQL设计架构
地址:http://www.17bianji.com/lsqh/35162.html
1/2 1