MySQL知识总结
原创于:极客时间 MySQL45讲(丁奇)
第1讲:一条SQL查询语句是如何执行的?
-
默认的存储引擎是
InnoDB
-
连接器
-
连接器负责跟客户端建立连接、获取权限、维持和管理连接。
mysql -h$ip -P$port -u$user -p
-
连接命令中的 mysql 是客户端工具,用来跟服务端建立连接。在完成经典的 TCP 握手后,连接器就要开始认证你的身份,这个时候用的就是你输入的用户名和密码。
-
连接完成后,如果你没有后续的动作,这个连接就处于空闲状态,你可以在
show processlist
命令中看到它。显示状态Sleep
-
客户端如果太长时间没动静,连接器就会自动将它断开。这个时间是由参数
wait_timeout
控制的,默认值是 8 小时。 -
数据库里面,长连接是指连接成功后,如果客户端持续有请求,则一直使用同一个连接。短连接则是指每次执行完很少的几次查询就断开连接,下次查询再重新建立一个。
-
建立连接的过程通常是比较复杂的,所以我建议你在使用中要尽量减少建立连接的动作,也就是尽量使用长连接。
-
但是全部使用长连接后,你可能会发现,有些时候 MySQL 占用内存涨得特别快,这是因为 MySQL 在执行过程中临时使用的内存是管理在连接对象里面的。这些资源会在连接断开的时候才释放。所以如果长连接累积下来,可能导致内存占用太大,被系统强行杀掉(OOM),从现象看就是 MySQL 异常重启了。
-
-
查询缓存
- 连接建立完成后,你就可以执行
select
语句了。执行逻辑就会来到第二步:查询缓存。 - 之前执行过的语句及其结果可能会以
key-value
对的形式,被直接缓存在内存中。key
是查询的语句,value
是查询的结果。 - 只要有对一个表的更新,这个表上所有的查询缓存都会被清空。
- 连接建立完成后,你就可以执行
-
分析器
- 如果没有命中查询缓存,就要开始真正执行语句了。
-
优化器
- 优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(
join
)的时候,决定各个表的连接顺序。
- 优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(
-
执行器
- 执行器调用一次,在引擎内部则扫描了多行,因此引擎扫描行数跟
rows_examined
并不是完全相同的。
- 执行器调用一次,在引擎内部则扫描了多行,因此引擎扫描行数跟