查询语句如何执行
如图,MySQL 可以分为 Server 层和存储引擎层两部分:
server层:
- 连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能
- 以及所有的内置函数(如日期、时间、数学和加密函数等)
- 所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等
存储引擎层:
- 负责数据的存储和提取。 其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。
现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。
- InnoDB 存储引擎:它是 MySQL 5.5 版本之后默认的存储引擎,最大的特点是支持事务、行级锁定、外键约束等。
- MyISAM 存储引擎:在 MySQL 5.5 版本之前是默认的存储引擎,不支持事务,也不支持外键,最大的特点是速度快,占用资源少。
- Memory 存储引擎:使用系统内存作为存储介质,以便得到更快的响应速度。不过如果 mysqld 进程崩溃,则会导致所有的数据丢失,因此我们只有当数据是临时的情况下才使用 Memory 存储引擎。
- NDB 存储引擎:也叫做 NDB Cluster 存储引擎,主要用于 MySQL Cluster 分布式集群环境,类似于 Oracle 的 RAC 集群。
- Archive 存储引擎:它有很好的压缩机制,用于文件归档,在请求写入时会进行压缩,所以也经常用来做仓库。
# 连接器
利用tcp完成与服务端的连接,校验用户名和密码
如果用户名密码认证通过,连接器会到权限表里面查出你拥有的权限。之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限
利用show processlist
查看连接的状态
默认8小时后自动断开连接
# 连接问题
为了减少建立连接的动作,尽量使用长连接。
mysql由内存管理连接对象,长连接累积下来,可能导致内存占用太大,被系统强行杀掉(OOM),比如 MySQL 异常重启了
解决方法:
- 定期断开长连接。使用一段时间,或者程序里面判断执行过一个占用内存的大查询后,断开连接,之后要查询再重连。
- 如果你用的是 MySQL 5.7 或更新版本,可以在每次执行一个比较大的操作后,通过执行 mysql_reset_connection 来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。
# 查询缓存
MySQL 8.0 版本直接将查询缓存的整块功能删掉了
将之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。
再次查询,如果命中缓存,就直接返回结果,效率高
警告
只要有对一个表的更新,这个表上所有的查询缓存都会被清空
query_cache_type
设置成DEMAND,使默认的 SQL 语句都不使用查询缓存
用 SQL_CACHE
显式指定使用查询缓存
select SQL_CACHE * from T where ID=10;
1
# 分析器
# 词法分析
T”识别成“表名 T”,把字符串“ID”识别成“列 ID”
比如:如果表 T 中没有字段 k,会在这一阶段报错
# 语法分析
判断你输入的这个 SQL 语句是否满足 MySQL 语法
如果你的语句不对,就会收到“You have an error in your SQL syntax”的错误提醒
# 优化器
- 在表里面有多个索引的时候,决定使用哪个索引;
- 或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序
# 执行器
- 判断执行权限
- 如果有权限,就打开表继续执行
编辑 (opens new window)