Select执行过程
两层架构:
-
Server 层:建立连接、分析和执行 SQL。
- 包括连接器,查询缓存、解析器、预处理器、优化器、执行器等。
- 内置函数、跨存储引擎的功能实现。
-
存储引擎层:数据的存储和提取。
-
支持 InnoDB、MyISAM、Memory 等多个存储引擎。
-
-
连接器:用户连接
-
# -h 指定 MySQL 服务得 IP 地址,如果是连接本地的 MySQL服务,可以不用这个参数; # -u 指定用户名,管理员角色名为 root; # -p 指定密码,如果命令行中不填写密码(为了密码安全,建议不要在命令行写密码),就需要在交互对话里面输入密码 mysql -h$ip -u$user -p
- TCP三次握手建立连接
- 验证用户名、密码
- 获取该用户的权限,保存起来。只有重新连接才能加载新的权限。
-
-- 查询连接列表 show processlist; -- 查看连接最大空闲时长,默认值是 8 小时 show variables like 'wait_timeout'; -- 连接数量限制,默认151 show variables like 'max_connections'; -- 设置max_connections SET GLOBAL max_connections=1000; -- 单次最大数据报文 SHOW VARIABLES LIKE 'max_allowed_packet'; -- 设置max_allowed_packet SET GLOBAL max_allowed_packet=8388608; -- 手动断开连接 kill connection + id
-
-
查询缓存
-
SQL 是查询语句时先查询缓存,MySQL 8.0 版本废弃。
-
Query Cache:
- key:SQL语句
- value:执行结果
-
缓存过期:只要一个表有更新操作,那么这个表的查询缓存就会被清空。
-
-
解析SQL:解析器
-
词法分析:识别关键字,构建出 SQL 语法树,方便模块获取 SQL 类型、表名、字段名、 where 条件等等。
-
语法分析:根据语法规则,判断否满足 MySQL 语法。
- 只负责构建语法树和检查语法,但是不会去查表或者字段存不存在。
-
-
执行SQL
-
Prepare 预处理阶段
- 检查 SQL 查询语句中的表或者字段是否存在;
- 将
select *
中的*
符号,扩展为表上的所有列;
-
Optimize 优化阶段:制定一个执行计划
- 某个值出现在表的数据行中的百分比(30%)很高,会忽略索引,进行全表扫描。
- 查看查询执行计划:explain + SQL
-
Execute 执行阶段:存储引擎交互
- 主键索引查询
- 全表扫描:存储引擎while循环查找,每查到一个就向执行器返回一条。
- 索引下推:选择条件字段在联合索引字段有就不去回表查询
-