MysqL 逻辑架构
从整体架构切入MysqL的学习,可以对 MysqL 有一个整体的把握,鸟瞰全貌,不至于一下陷入细节里边, 对于以后深入理解 MysqL 也是有很大帮助的。本文通过讲解一条查询语句在 MysqL 内部的执行过程,让您对 MysqL 逻辑架构有更深的了解。
1. 逻辑架构组成
存储引擎层负责数据的存储和提取,MysqL 采用插件式的存储引擎,常见的存储引擎有 InnoDB、MyISAM、 CSV 等。其中 InnoDB 是最常用的存储引擎,也是 MysqL 的默认存储引擎(从5.5.5版本开始)。
2. 一条查询语句是如何执行的
select id from where id=;
2.1 连接池
连接命令如下(输入完连接命令后,需要输入用户密码):
MysqL -h localhost -u root -p
建立连接后,会产生相应的连接信息,可以通过 show processlist 命令查看。下方图中 Id 为 5048 这一行,即为成功连接数据库所建立的连接信息,请注意 Command 这一列,值为”Sleep“,表明这是一个空闲连接。成功连接数据库后,如果没有任何动作,这个连接就会变成空闲状态。
root@localhost [(none)]>show processlist;
+------+------+-----------+------+---------+------+----------+------------------+
| Id | User | Host | | Command | Time | State | Info |
+------+------+-----------+------+---------+------+----------+------------------+
| | root | localhost | NULL | Query | | starting | show processlist |
| | root | localhost | NULL | Sleep | | | NULL |
+------+------+-----------+------+---------+------+----------+------------------+
rows in set ( sec)
2.2 查询缓存
因为只要一个表有更新操作,那这个表所有的查询缓存都会被清空。对一个承载正常业务的数据库来说,更新操作是非常频繁的,这就意味着查询缓存经常失效,从而导致查询缓存的命中率非常低。所以,使用查询缓存反而会给数据库带来额外的负担,在实际生产环境中,我们建议关闭查询缓存。
2.3 解析器
如果没有命中查询缓存,接下来就要进入解析器阶段了。解析器负责词法解析和语法解析。
select id from where id=;
关键字 | 非关键字 | 关键字 | 非关键字 | 关键字 | 非关键字 |
---|---|---|---|---|---|
select | 字段id | from | 表名a | where | 字段id等于1 |
接下来是语法解析,判断输入的这个sql语句是否符合MysqL语法规则。如果语法不对,会收到错误信息提示:“ERROR 1064 (42000): You have an error in your sql Syntax;”。如下面这个sql语句的where少了一个e。
root@localhost [tempdb]>select id from wher id=;
ERROR (): 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 'id=1' at line
2.4 优化器
从解析器出来,就到了优化器阶段。优化器负责找到最优的执行计划,也就是决定sql语句的执行方案。
select id from where id=;
- 可以遍历表a所有行,找出所有id等于1的值
- 也可以通过索引idx_id,找到id等于1的值。当然,前提是字段id有创建索引idx_id。
两种方案的结果是一样的,但是执行效率不一样,优化器的作用就是选择最优的执行方案。
2.5 执行器
select id from where id=;
假设这个例子中的字段id没有索引,执行器的流程大致如下:
3. 小结
通过本文的讲解,对您认识 MysqL 逻辑架构,有所帮助吗?欢迎反馈宝贵意见,以便我们不断改进。