一、MySQL 的基本组成模块

当输入一条 MySQL 语句时,这条语句是如何被执行的? 需要经过 MySQL 哪些部分,才能将执行结果取出? 本文章简单记录下,MySQL 语句的执行过程,并以此了解 MySQL 的组成部分。

下图是 MySQL 的基本架构示意图。

image.png

MySQL 可以分为 Server 层和存储引擎层两部分

1、Server 层包括了 连接器、查询缓存、分析器、优化器、执行器等,涵盖了 MySQL 的大多数核心服务功能1111,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在 Server 层实现,比如存储过程、触发器、视图等。

2、存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。 目前最常见的存储引擎是 InnoDB。

连接器

首先,从客户端发起请求,连接到数据库上,这时处理请求的就是 MySQL 的连接器。 连接器负责和客户端建立连接、获取权限、维持和管理连接。
连接命令一般如下:

mysql -h$ip -P$port -u$user -p

在连接MySQL 成功后,连接器会到权限表中查询此用户拥有的权限。 一个用户成功建立连接后,如果此用户的权限在连接中被修改,不会影响到当前存在的连接权限。 只有重新建立连接,连接器才会从权限表中重新读取新的权限设置。

如果想要查询当前 MySQL 的连接状态,可以通过 show processlist 命令看到:


image.png

其中, Command 是指当前连接的状态,如果连接完成后,一直没有后续动作,此状态会变成 "Sleep"。如果此空闲连接一直没有动静,连接器会将此连接断开。这个时间由 wait_timeout 控制,默认为8小时。

数据库中,长连接是指连接成功后,如果客户端持续有请求,则一直使用同一个连接。短连接则是指每次执行完很少的几次查询就断开连接,等待下次查询再重新建立一次连接。

建立连接的过程通常比较复杂,所以一般建议使用长连接。

但是全部使用长连接后,可能会发现,有时候 MySQL 占用内存涨得特别快,这是因为 MySQL 在执行过程中临时使用的内存是管理在连接对象里面的。这些资源会在连接断开时才释放。 所以如果长连接累积下来,可能导致内存占用太大,被系统强行杀掉(OOM),也就是 MySQL 异常重启。

考虑一下两种方案解决此问题:
1、定期断开长连接。或者程序中判断执行过一个占用内存的大查询后,断开连接。
2、如果使用的是 MySQL5.7及以上版本,可以在执行一个大操作后,通过执行 mysql_reset_connection 来初始化连接资源。

查询缓存

MySQL 在连接建立完成后,拿到一个查询请求,会到查询缓存中看看,之前是否执行过此语句。 因为之前执行过的语句及其结果可能会以 key-value 的方式存在缓存中。 如果查询的请求命中的某个查询缓存中的 key,其 value 会被直接返回给客户端。

如果查询语句不在查询缓存中,则继续执行后续步骤。执行完成后,其结果会被存入查询缓存中。

当对一个表有更新时,此表上的所有查询缓存会被清空。 这也就导致查询缓存非常容易失效,所以,大部分情况下,其实不建议使用查询缓存。

分析器

当查询请求未命中查询缓存,则 MySQL 开始真正执行此语句。
请求会来到 分析器 中,对 SQL语句做解析。
如果请求的 SQL 语句语法有问题,或者说请求的表不存在等等,分析器会返回错误信息。

优化器

MySQL 通过分析器知道了请求的 SQL 语句要“做什么”后,会通过优化器来决定 “怎么做”。
优化器会在表中有多个索引时,决定使用哪个索引。或者在一个语句中有多表关联时,决定表的关联顺序。

执行器

接下来进入 MySQL 的执行器,开始执行语句。
开始执行前,会判断此用户是否有对 SQL 请求中的表有对应的执行权限。
然后, 执行器会打开表继续执行。 执行器会根据表的引擎定义,使用这个引擎提供的接口。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容