大数据、Java EE 学习资料请关注 B 站:https://space.bilibili.com/204792350

SQL 查询语句执行原理

逻辑架构

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

Server 包含连接器、查询缓存、分析器、优化器、执行器等

连接器: - 管理连接,权限验证 查询缓存 - 分析器 - 词法分析,语法分析 优化器 - 执行计划生成,索引选择 执行器 - 操作引擎,返回结果

存储引擎 负责数据的存储和获取,提供读取接口,其架构模式是插件式

  • InnoDB
    • 默认引擎(MySQL 5.5.5 版本开始)
  • MyISAM
  • Memory
    • 内存引擎

创建表的时候,在 create table 中使用 engine=引擎 设置存储引擎

不同的引擎共用 Server 层,类是 PDO

语句的执行过程

SELECT * FROM table_name;

连接器

首先会通过连接器,连接数据库,其负责跟客户端建立连接,获取权限,维持和管理连接

连接命令:

mysql -h$ip -P$port -u$root -p
  • -h:数据库主机
  • -P:数据库端口
  • -u:用户名
  • -p:密码

通过上面的命令连接

  • 如果密码错误,会提示 "Access denied for user" 的错误,结束执行
  • 如果认证通过,连接接着会读取登陆用户的权限,之后的所有权限逻辑判断,都依赖于此刻读取到的权限

建立连接之后,即使对登陆用户修改了权限,那也只会在新连接生效

建立连接后,如果没有后续操作,那么该连接会处于空闲状态

查看进程列表

mysql>show processlist;

若太长时间没有操作,连接器会自动断开,这个时间由 wait_timeout 控制,默认值是 8 小时

连接分两种方式:

  • 长连接
    • 指连接成功之后,客户端持续有请求,则一直使用同一连接
  • 短连接
    • 指每次执行完几次查询后就断开连接

建立连接的过程是比较复杂的,所以建立连接的时候,尽量建立长连接

但是长连接在占用内存会特别快

解决方法

  • 定期断开长连接或者执行完一个内存占用过大的查询就断开
  • MySQL 5.7 往后的版本,可以通过 mysql_reset_connection 重新初始化连接资源,过程不需要做重连和权限验证

思考

  1. 为何在分析器之后会走查询缓存?难道不应该是执行器之后将结果缓存吗?
# 数据库   Mysql  

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×