MySQL随笔01_一条SQL语句是如何执行的

一、MySQL基础架构示意图

file

二、MySQL分层

总体来讲,MySQL可以分为二层:Server层存储引擎 两部分,如下图所示。
不同的存储引擎共用一个Server层。

file

三、各部分组件概述

连接器

负责与客户端建立连接、获取权限、维持和管理连接。比如常规的连接MySQL Server的命令如下

mysql -h$ip -P$port -u$user -p
回车-->输入密码
  1. 命令中的mysql是客户端工具,用来与服务端建立连接,通过TCP协议进行连接。
  2. MySQL客户端Server连接器连接成功后 进行身份认证,若是认证通过,连接器则会到权限表查询用户所拥有的权限。
  3. 一旦客户端与Server之间成功建立连接,当前连接将会保持已查询到的用户权限,即使是管理员账号对用户权限做了修改,也不会影响已经存在的连接权限,即新权限对新的连接生效。
  4. 连接完成后,若是没有后续动作,则连接处于空闲状态,可以通过 show processlis 命令查看连接的状态。Command 列即为连接当前所处的状态。
  5. 客户端若是长时间没有使用,连接器会自动断开连接,可通过参数 wait_timeout 来设置,默认为8小时。
  6. 若是客户端与Server之间的连接 被连接器超时断开后,客户端再次发送请求时,则会收到“丢失连接”错误,若是要继续操作则需要进行重连。
  7. 关于数据库的连接
    长连接 指连接成功后,如果客户端持续有请求,则一直使用同一个连接。
    短连接 指 每次执行完很少的几次查询就断开连接,下次查询再重新创建一个连接。
    建立连接通常比较复杂 以及耗费资源,因此,在使用过程中要尽量减少建立连接的动作,即 尽量使用长连接。
  8. 关于使用长连接时,有些时候MySQL占用内存增长很快的问题
    原因 MySQL在执行过程中临时使用的内存是管理在连接对象里面的,被占用的内存资源 是在连接断开的时候才释放。
    后果 长连接随着使用时间不断累积下来,可能导致内存占用太大,被系统强制杀掉(OOM),从表现上来看就是MySQL异常重启了。
    解决方案
    1). 定期断开长连接。 使用一段时间、或者程序中判断执行过一个占用内存大的查询后,断开连接,之后查询再重连。
    2). 如果使用的是MySQL 5.7或更高版本,可以在每次执行一个比较大的操作后,通过 mysql_reset_connection 来重新初始化连接资源(释放连接所占用的内存资源)。
    这个重置连接的操作,不需要重连和重新做权限验证,但是可以将连接恢复到新创建完连接时的状态。
查询缓存

在客户端与MySQL Server建立连接后,就可以进行DML等操作了。

  1. MySQL中,对于之前执行过的语句及其结果 可能会以 key-value 对的形式被直接缓存在内存中,key为查询语句,value是查询结果。
  2. MySQL收到查询请求时,会先到查询缓存查找:
    若命中缓存key,则直接返回value结果给客户端,MySQL不需要继续执行后面的操作——效率高;
    若语句不在查询缓存中,则会执行后面的各执行阶段。执行完成后,执行结果被保存到查询缓存中。
  3. 大多数情况下不建议使用查询缓存——>>查询缓存的使用 往往 弊大于利
    为什么?——查询缓存的失效非常频繁,只要有对一个表有更新,则这个表上的所有查询缓存都会被清空。 对于更新频繁的数据库来说,查询缓存的命中率非常低。
    MySQL提供了按需使用的方式,通过 query_cache_type 参数来设置是否开启查询缓存。(注意:MySQL 8.0 版本直接将查询缓存功能去掉了)
    query_cache_type 参数值选项:
    DEMAND对于默认的SQL语句都不使用查询缓存。
    SQL_CACHE对于确定要使用查询缓存的语句显示指定。如下命令
mysql> select SQL_CACHE * from T where ID=10;
分析器

分析器对客户端提交过来的SQL语句进行解析。
首先,进行词法分析。对语句字符串进行拆解,识别出数据库保留关键字、表、列 等。
其次,对词法分析的的结果做语法分析。语法分析器根据语法规则,判断输入的SQL是否满足MySQL语法。如果SQL语句不对,则会收到“语法错误”提醒。

优化器

通过分析器,MySQL就知道要干什么了。 但是在执行之前,需要经过优化器的处理。
优化器的处理范畴:

  1. 在表里有多个索引的时候,决定使用哪个索引;
  2. 在一个关联查询语句中,决定各个表的连接顺序 等。
    优化器的作用——决定使用哪种方案进行查询。
    优化器如何选择索引,是否会选错索引 等问题 后续讲解。
执行器
  1. MySQL通过【分析器】知道了要干什么,通过【优化器】知道了该怎么做,于是执行阶段开始执行语句。
    分析器——知道要干什么
    优化器——知道该怎么做
    执行器——执行语句
  2. 执行器在执行语句时,需要做权限检查,有权限则打开表继续执行,打开表时,执行器根据表的引擎定义,去选择该引擎提供的接口。
  3. 在数据库的慢查询日志中,有一个 rows_examined 字段,表示这个语句执行过程中扫描了多少行,该值在执行器每次调用引擎获取数据行的时候进行累加。
    在有的场景下,执行器调用一次,在引擎内部则扫描了多行,因此——引擎扫描行数 与 rows_examined并不完全相同。

四、小结

MySQL逻辑架构简述,通过一个SQL的完整执行流程的各个阶段有一个初步印象。

五、思考题

如果表T中没有字段K,而执行如下语句,则会报“不存在这个列”的错误,这个错误是在上面提到的哪个阶段报出来的呢?

select * from T where k=1;

解答:分析器。Oracle会在分析阶段判断语句是否正确,表是否存在,列是否存在等,MySQL也这样。

六、评论区笔记与问题

笔记1

1,连接
连接管理模块,接收请求;连接进程和用户模块,通过,连接线程和客户端对接
2,查询
查询缓存 Query Cache
分析器,内建解析树,对其语法检查,先from,再on,再join,再where......;检查权限,生成新的解析树,语义检查(没有字段k在这里)等
优化器,将前面解析树转换成执行计划,并进行评估最优
执行器,获取锁,打开表,通过meta数据,获取数据
3,返回结果
返回给连接进程和用户模块,然后清理,重新等待新的请求。

笔记2

1、mysql主要组成部分:连接器,分析器,优化器,执行器,存储引擎。
2、连接器:验证账号密码,维持链接,超时自动断开,链接过程复杂,建议使用长链接,连接比较占用内存,需要定时断开,5.7之后可以使用mysql_reset_connection。
3、分析器:验证语法的合规性,把sql转换成mysql内部识别的语句,表明转换成对应的id。
4、优化器:判断sql内部的执行顺序。
5、执行器:验证操作库表是否有权限,调存储引擎接口查询数据。
6、慢查询日志rows_examined,记录查询的时候扫描了多少行,相同表有肯能次数不同。

问题1

1、客户端连接MySQL时,有时候会突然断开,然后又自动恢复的情况,修改 <code>connection_timeout </code> 参数?
connection_timeout 指的是“连接过程中”的等待时间;
wait_timeout 指的是“连接完成后,使用过程中”的等待时间。

问题2

1.MySQL的框架有几个组件, 各是什么作用?
2.Server层和存储引擎层各是什么作用?
3.you have an error in your SQL syntax 这个保存是在词法分析里还是在语法分析里报错?
4.对于表的操作权限验证在哪里进行?
5.执行器的执行查询语句的流程是什么样的?


本随笔源课程:https://time.geekbang.org/column/article/68319

本文由博客一文多发平台 OpenWrite 发布!

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