MySQL整体简单认识
在MySQL的整体架构里面,主要是分为连接层,服务层,引擎层;
架构图就是下面这个图了(我画了好久呢)
然后我们来简单了解一下MySQL各个架构的职责
(分类情况我拿颜色标注了的)
Connectors:与客户端进行连接的服务,主要完成一些类似连接处理,授权及相关的安全工作;为了优化连接的性能,在该层引入了连接池的概念;
服务层(图中绿色部分):提供核心的服务功能,实现SQL接口,完成缓存的查询,SQL的分析和优化部分及内置函数的执行,服务器会解析并创建相应的内部解析树,并对SQL语句完成一定的优化,生成相对应的执行操作:
引擎层:存储引擎是真正负责MySQL中数据的存储和提取的,服务器通过API与存储引擎进行通信;(MySQL默认是InnoDB存储引擎)
存储层:主要是将数据存储在运行的计算机文件系统之上,并完成与存储引擎的交互;
MySQL分层的好处:哪个出问题可以去找哪个层,插件式的存储引擎,将查询处理和其他的系统任务以及数据的提取相分离,特别是可拔插的存储引擎,可以让我们根据业务需求选择合适的存储引擎;
存储引擎的概念:MySQL的数据需要才有一些“技术手段”,才可以存储在文件(或者内存当中),这些技术中的就是一种我们用到的存储引擎,存储引擎主要有存储机制,索引技巧锁定水平,通过不同的存储引擎,存储数据的时候,所获得的功能与性能是有差别的;
如果你是研究大量的临时数据,为了效率可以直接采用内存存储引擎;
如果你是需要ACID特性去使用数据库的,可以选择支持事务的存储引擎;(目前MySQL当中就InnoDB支持事务特性)
如果查看存储引擎?
采用命令:show engines;
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
8.0version(啥都没)
所以我们缓存还是交给专业的工具去完成吧:redis是个不错的选择
文件结构:
frm文件是存储描述表结构文件的、字段长度的
MYD(MYData)文件是数据信息文件,存储数据信息
MYI(MYIndex)文件是存储索引信息的
idb文件是存储数据信息和索引信息的
MySQL的SQL语句编写顺序与MySQL本身读取顺序有些许区别
我们通常编写MySQL的顺序:
MySQL内部实际执行顺序
SQL语句要给计算机识别也是依赖解析树这个解析的
SELECT name FROM user_info WHERE id = 1 AND age > 20
上面这条SQL的执行解析如下
另外提一句,你写的SQL如果不是最优的写法,MySQL内部有一个优化器,可以帮助你进行优化SQL,但是这个优化器不是绝对的优化的,MySQL只是在尽可能的帮你进行优化SQL语句
一条SQL在连接到返回结果的执行过程
了解了MySQL作为数据库服务器的一些内部构造,可以让我们更好地选择MySQL一些常见的选择,也可以让我们清楚编写一条SQL语句从点击运行到返回结束的一些生命历程;
通过上述的基本常识,我们也才能去思考,怎么去写好一条SQL,怎么用好SQL;