逻辑架构
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 重新初始化连接资源,过程不需要做重连和权限验证
思考
- 为何在分析器之后会走查询缓存?难道不应该是执行器之后将结果缓存吗?
Q.E.D.
Comments | 0 条评论