- 老刘是即将找工作的研究生,自学大数据开发,一路走来,感慨颇深,网上大数据的资料良莠不齐,于是想写一份详细的大数据开发指南。这份指南把大数据的【基础知识】【框架分析】【源码理解】都用自己的话描述出来,让伙伴自学从此不求人。
- 大数据开发指南地址如下:
- github:https://github.com/BigDataLaoLiu/BigDataGuide
- 码云:https://gitee.com/BigDataLiu/BigDataGuide
- 您的点赞是我持续更新的动力,禁止白嫖,看了就要有收获,有需要联系公众号:努力的老刘。
今天给大家分享的是大数据开发基础部分MySQL的第一篇,老刘讲点和别人不一样的内容!众多伙伴都知道MySQL的基础知识以及使用,但是对里面的原理知道的不多,咱们学知识只看表面绝对是不行的,所以老刘争取把MySQL的架构知识给大家讲明白!
MySQL架构篇的大纲如下:
看完老刘这篇内容后,希望你们能够掌握以下内容:
首先分享出MySQL逻辑架构图,我们可以看到MySQL是由很多模块组合而成,各个模块都发挥着重要的作用,下面分别介绍各个模块的概念及其作用。
Connectors,它指的是和不同的语言中的SQL进行交互。
它的作用是备份集群和集群管理。
管理连接,进行权限验证之类的。
接收SQL命令(比如DDL、DML)后,返回用户需要查询的结果。但是接收到SQL命令后,我们需要把它变为有意义的SQL,要被系统识别出来你这个SQL要干什么,就需要对SQL语句进行解析,所以就需要Parser解析器。
解析分为词法解析和语法解析,举例说明词法解析和语法解析。
SQL命令传到解析器后会被解析器验证和解析,先进行词法分析,分词形成select、*、from、t1,解析完成之后形成一颗语法树,在进行语法分析,分析SQL语句对不对,如果不对,说明这个SQL语句不合理。
在上一步语法正确后会传到这一部分,SQL语句在真正执行之前,MySQL会认为你的语句不是最优的,它会对它进行优化。其中使用explain查看的SQL语句执行计划,就是查询优化器生成的!
例如:select * from tuser where name like 'a%' and id = 1;
这句话就会进行优化,至于为什么会优化,后面会讲到,先知道就行,会变为这样的语句。
select * from tuser where name id = 1 and like 'a%';
把查询的结果存起来,但它针对的不是SQL语句,而是SQL语句经过哈希后的值。如果下次有相同查询结果,就不会到Pluggable Shortage Engines储存引擎,直接在缓存中把查询结果拿出来。(现在作用不大,在新的MySQL被去掉了,不用了)
可插拔的存储引擎,也就是MySQL数据库提供了多种存储引擎。它就是用来存储数据的,如何为存储的数据建立索引和如何更新之类。
在MySQL中,主要的存储引擎有两种:MyIsam和InnoDB。
MyIsam是高速引擎,拥有较高的插入、查询速度。但不支持事务、行锁等;
InnoDB是5.5版本后MySQL默认的数据库,支持事务和行级锁定,事务处理、回滚、崩溃修复能力和多版本并发控制,比MyIsam处理速度稍慢,支持外键。
那我们如何选择存储引擎类型呢?
InnoDB:支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那一般都会选择InnoDB。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为它支持事务的提交和回滚。
MyIsam:插入数据快,空间和内存使用比较低。如果表主要是用于插入新纪录和读出记录,那么选择MyIsam能实现处理高效率。
下面老刘放一张MyIsam和InnoDB区别的图:
如何记住执行流程图?根据逻辑架构图各模块的执行顺序来记!
说完简版的执行流程图,感觉差不多就可以了。但是当初学习的时候,还有一个详细版执行流程图,老刘也好好说说流程。
到这一步,逻辑架构图就讲完了,大家可以好好捋捋思路和逻辑,一下就能记住。
MySQL从物理结构上可以分为日志文件和数据索引文件,它在Linux中的数据索引文件和日志文件都在/var/lib/mysql目录下,并且日志文件采用顺序IO方式进行存储,而数据文件采用随机IO方式进行存储。
在这个地方提个问题:为什么日志文件采用顺序IO方式进行存储而数据文件采用随机IO进行存储?
下面开始介绍日志文件中的各个日志,只介绍那些
错误日志(errorlog)
默认开启,记录每次运行过程中遇到的所有严重错误信息,以及MySQL每次启动和关闭的详细信息。
二进制日志(binlog)
这个太重要了,大家一定要记住!
默认关闭,它记录数据库中所有DDL语句和DML语句,但不包括select语句内容。DDL语句直接记录到binlog中,而DML语句必须通过事务提交才能提交到binlog中,它主要用于实现mysql主从复制、数据备份、数据恢复、
通用查询日志(general query log)
默认是关闭的,它会记录用户的所有操作,其中还包含增删改查等信息,在并发操作大的情况下会产生大量的信息,从而导致不必要的磁盘IO,会影响mysql性能。
慢查询日志(slow query log)
默认关闭,记录执行时间超过long_query_time秒的所有查询,收集查询时间比较长的SQL语句,可以用来提高查询性能。
重做日志(redo log)
它主要用来确保事务的持久性。防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的持久性这一特性。
回滚日志(undo log)
它保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC)。
中继日志(relay log)
关于这个,老刘知道两个地方有用到它,一是mysql主从复制,二是canal同步mysql增量数据。主要就是从服务器I/O线程将主服务器的二进制日志读取过来记录到从服务器本地文件,然后从服务器SQL线程会读取relay-log日志的内容并应用到从服务器,从而使从服务器和主服务器的数据保持一致。
InnoDB数据文件
MyIsam数据文件
本文作为大数据开发指南MySQL的第一篇详细介绍了MySQL架构内容,对各个模块以及流程进行了详细介绍,希望大家能够跟着老刘的文章,好好捋捋思路,争取能够用自己的话把这些知识点讲述出来!
尽管当前水平可能不及各位大佬,但老刘会努力变得更加优秀,让各位小伙伴自学从此不求人!
如果有相关问题,联系公众号:努力的老刘。文章都看到这了,点赞关注支持一波!