MySQL 基础架构:一条SQL查询语句如何执行
- 连接器(管理连接、权限验证)
- 查询缓存(5.7不推荐使用,8.0完全废弃)
- 解析器(解析树)
- 优化器(索引选择、表关联顺序、执行计划)
- 执行器(调用存储引擎接口)
- 执行引擎(InnoDB、MyISAM、Memory)
MySQL 分成Server层和存储引擎层两部分。
连接器
mysql -h<ip> -P<port> -u<user> -p
建立连接后,连接器会查询权限表。
- 如果使用
GRANT
/REVOKE
修改用户权限,权限会立即生效 - 如果直接更新权限表,需要使用
FLUSH PRIVILEGES
或重新登录,权限才会生效
查看连接状态;默认连接空闲超过8小时会自动断开(由 wait_time
参数控制),断开后查询会收到 lost connection
错误
show processlist
长连接/短连接:在应用中应该尽量使用长连接,避免频繁建立断开连接的开销。
但是查询执行过程临时使用的内存是由连接对象管理的,所以长连接可能会占用大量内存问题
- 定期断开连接或执行大查询后断开连接
- MySQL 5.7 后可以通过 mysql_reset_connection 重新初始化资源,但不会重连和重做权限校验
查询缓存
缓存失效:只要对表进行更新,表上的所有查询缓存都会被清空。
按需使用缓存,设置参数 query_cache_type=demand
后查询默认不进行缓存,使用缓存需要显示指定 SQL_CACHE
select sql_cache * from table
MySQL 8.0 移除查询缓存功能
分析器
分析器:进行词法分析和语法分析,生成解析树。
优化器
优化器:索引选择、表关联顺序、生成执行计划
查看执行计划
explain select * from table
执行器
解析器执行后会校验用户有没有表权限(precheck),执行器在执行时会在此之前校验用户有没有表权限(触发器、存储过程等一些在运行时涉及的表)
慢日志中的 rows_examined(扫描行数),就是在每次调用存储引擎接口是累加的。
标签:执行,缓存,查询,基础架构,MySQL,权限,连接 From: https://www.cnblogs.com/liaozibo/p/18462508