MySQL 的逻辑链接架构图
1. 客户端连接数据库
- 用
wait_timeout
参数控制连接器长时间没操作自动断开的时间
- 只有新建的连接才会使用新的权限设置
- 尽量使用长连接
- 使用长连接的问题:可能内存疯涨,因为 MySQL 在执行过程中临时使用的内存是管理在连接对象里面,在连接断开的时候才释放
- 两个解决方案
- 定期断开长连接。使用一段时间,或者程序里面判断执行过一个占用内存的大查询后,主动断开连接,之后要查询再重连
- MySQL 5.7 或更新版本,可以在执行一个比较大的操作后,执行
mysql_reset_connection
初始化连接资源
- 这个过程不会重连和重新做权限验证,会将连接恢复到刚刚创建完时的状态
2. 查询缓存
- MySQL 8.0 版本删除此功能
- 建议不使用
- 对一个表的更新,表上所有的查询缓存都会被清空
- 设置
query_cache_type = DEMAND
,对于默认的 SQL 语句都不使用查询缓存
3. 分析器
- 词法分析
- 语法分析
4. 优化器
- 决定使用哪个索引
- 决定各个表的连接顺序
- 后面的文章会单独展开说明优化器的内容
5. 执行器
- 判断执行权限
- 根据表的引擎定义,使用引擎提供的接口
- 关于慢查询日志中的
rows_examined
字段
- 执行器每次调用引擎获取数据行的时候累加
- 跟引擎扫描行数并不是完全相同的
- 后面有实战文章单独展开讲存储引擎的内部机制