本文及后面的几篇 MySQL 相关笔记总结是本人在极客时间专栏「MySQL 实战45讲」和掘金小册「MySQL 是怎样运行的:从根儿上理解 MySQL」的学习笔记整理,并参考了其他材料,还有一些个人的理解和思考,若有不正之处敬请指正。
顺便推荐一下这两个专栏。
2. 基本架构
MySQL 基本架构示意图如下:
MySQL基本架构【来自极客时间】
MySQL 从整体来说还是 CS 架构,也就是由客户端(Client)和服务器端(Server)两大部分构成。这里主要分析服务器端架构。
服务器端大体可以分为两部分:Server 层和存储引擎层(二者的功能跟日常开发中的 Service 层和与 DAO 层的关系有点像,可以对比理解)。
2.1 Server 层
主要包括连接器(Connector)、查询缓存(Cache)、分析器(Parser)、优化器(Optimizer)和执行器(Executor)等。
该部分包含了 MySQL 的大部分核心功能以及所有的内置函数(日期、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,例如存储过程、触发器等。
下面简要介绍各个部分的功能。
2.1.1 连接器
# 连接失败(密码错误)
$ mysql -uroot -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
连接成功
# 连接成功
$ mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.7.19 MySQL Community Server (GPL)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>这些连接的处理和错误提示就是「连接器」来处理的。
查看连接状态
成功连接 MySQL 之后,可以用如下命令查看连接的状态:
# 查看连接状态
mysql> show processlist;
+----+------+-----------+------+---------+------+----------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+------+---------+------+----------+------------------+
| 6 | root | localhost | NULL | Sleep | 81 | | NULL |
| 7 | root | localhost | NULL | Query | 0 | starting | show processlist |
+----+------+-----------+------+---------+------+----------+------------------+
2 rows in set (0.00 sec)PS: 连接成功后是有超时时间的,若太长时间没有操作连接会断开,默认 8 小时,由参数 wait_timeout 控制。
2.1.2 查询缓存
You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near ...PS: 前面 JVM 系列专栏中,有篇文章
提到 Javac 编译器也有词法分析和语法分析的操作,这两者看似不相干,其实是类似的。
PPS: 这里再多说一句,学习技术的过程中,会逐渐发现有些看起来似乎没什么联系的东西,它们背后还是有一些相通之处的,这不就是一个栗子 吗?
2.1.4 优化器