vlambda博客
学习文章列表

MySQL整体简单认识

1
MySQL逻辑架构

    在MySQL的整体架构里面,主要是分为连接层,服务层,引擎层;

    架构图就是下面这个图了(我画了好久呢)



然后我们来简单了解一下MySQL各个架构的职责

(分类情况我拿颜色标注了的)


Connectors:与客户端进行连接的服务,主要完成一些类似连接处理,授权及相关的安全工作;为了优化连接的性能,在该层引入了连接池的概念;

服务层(图中绿色部分):提供核心的服务功能,实现SQL接口,完成缓存的查询,SQL的分析和优化部分及内置函数的执行,服务器会解析并创建相应的内部解析树,并对SQL语句完成一定的优化,生成相对应的执行操作:

引擎层:存储引擎是真正负责MySQL中数据的存储和提取的,服务器通过API与存储引擎进行通信;(MySQL默认是InnoDB存储引擎)

存储层:主要是将数据存储在运行的计算机文件系统之上,并完成与存储引擎的交互;



为什么需要分层呢???





MySQL分层的好处:哪个出问题可以去找哪个层,插件式的存储引擎,将查询处理和其他的系统任务以及数据的提取相分离,特别是可拔插的存储引擎,可以让我们根据业务需求选择合适的存储引擎;


2
存储引擎基础概念

    存储引擎的概念:MySQL的数据需要才有一些“技术手段”,才可以存储在文件(或者内存当中),这些技术中的就是一种我们用到的存储引擎,存储引擎主要有存储机制,索引技巧锁定水平,通过不同的存储引擎,存储数据的时候,所获得的功能与性能是有差别的;


如果你是研究大量的临时数据,为了效率可以直接采用内存存储引擎;

如果你是需要ACID特性去使用数据库的,可以选择支持事务的存储引擎;(目前MySQL当中就InnoDB支持事务特性)


如果查看存储引擎?


采用命令:show engines;

MySQL整体简单认识


Transaction:事务    XA:分布式事务    

Savepoints:事务的逻辑保存点


我们可以看到InnoDB这个老哥,支持那么多东西,是不是就代表他很优秀呢?


其实并不然:MySQL当中还存储这些可选项的存储引擎,足以证明其他存储引擎还有有好处,存储引擎无好坏,根据场景选择合适的存储引擎即可;


比较流行的两个存储InnoDB与MyISAM

我们来简单说一下区别



InnoDB MyISAM
主外键 支持 不支持
事务 支持 不支持
行表锁 表锁 行锁
缓存

索引与数据

都有缓

只缓存索引

不缓存数据

关注点 事务 性能
文件结构

.fm

.MYD(MYData)

.MYI(MYIndex)

.frm

.ibd

    注意:MySQL在5.7的时候默认关闭缓存的,在8.0的时候已经把缓存废弃掉了;(因为这个缓存只要修改表的一处数据,便会导致这个表的所有的缓存失效)


查看缓存命令:show variables like 'query_cache%'

我的电脑当中安装了两个MySQL,一个是5.7,一个是8.0

简单验证一下


5.7version

MySQL整体简单认识


8.0version(啥都没

MySQL整体简单认识


所以我们缓存还是交给专业的工具去完成吧:redis是个不错的选择


文件结构:

frm文件是存储描述表结构文件的、字段长度的

MYD(MYData)文件是数据信息文件,存储数据信息

MYI(MYIndex)文件是存储索引信息的

idb文件是存储数据信息和索引信息的


3
执行顺序

MySQL的SQL语句编写顺序与MySQL本身读取顺序有些许区别


我们通常编写MySQL的顺序:

MySQL整体简单认识


MySQL内部实际执行顺序


MySQL整体简单认识

4
一条SQL的点点滴滴

    SQL语句要给计算机识别也是依赖解析树这个解析的


SELECT name FROM user_info WHERE id = 1 AND age > 20


上面这条SQL的执行解析如下


MySQL整体简单认识


另外提一句,你写的SQL如果不是最优的写法,MySQL内部有一个优化器,可以帮助你进行优化SQL,但是这个优化器不是绝对的优化的,MySQL只是在尽可能的帮你进行优化SQL语句


一条SQL在连接到返回结果的执行过程

MySQL整体简单认识



最后的最后

    了解了MySQL作为数据库服务器的一些内部构造,可以让我们更好地选择MySQL一些常见的选择,也可以让我们清楚编写一条SQL语句从点击运行到返回结束的一些生命历程;

    通过上述的基本常识,我们也才能去思考,怎么去写好一条SQL,怎么用好SQL;