查询过程
Server层
-
连接器
- 负责跟客户端建立连接、获取权限、维持和管理连接
- 连接方式
- TCP/IP
- 命名管道和共享内存
- UNIX域套接字
- 建立连接:后续权限变更不会影响该连接
- 有限制的连接数
- 每个连接占用一个线程
- 断开连接会缓存线程
- 超时,wait_timeout(默认8小时),连接器会主动断开
show processlist
:查看当前连接- Command列显示为“Sleep”为空闲状态,超时会断开,参数wait_timeout控制
注意:尽量减少建立连接的动作
-
查询缓存,不推荐,8.0废弃
-
分析器
解析SQL语句
- 词法分析,分词,识别关键词
- 语法分析,分词后的组合是否符合规则
-
优化器
- 决定使用哪个索引
- 有多表关联(join) 的时候,决定各个表的连接顺序
-
执行器
- 判断执行查询的权限
- 打开表,使用引擎接口
- 扫描行数,符合添加不符合下一个
- 字段rows_examined:表示扫描的行数,这个值是在执行器每次调用引擎获取数据行的时候累加的
- 有些时候,执行器调用一次,引擎会扫描多行,所以rows_examined与引擎扫描行数不一定相同
-
其他
- 所有的内置函数(如日期、时间、数学和加密函数等)
- 所有跨存储引擎的功能,比如存储过程、触发器、视图等
存储引擎层
- 负责数据的存储和提取。插件式的。
- 其架构模式是插件式的,支持InnoDB、MyISAM、 Memory等多个存储引擎。
- MySQL 5.5.5版本InnoDB开始成为了默认存储引擎(手动指定engine=memory)
文件系统
更新过程
引擎将这行新数据更新到内存中,同时将这个更新操作记录到redo log里面,此时redo log处于prepare状态。然后告知执行器执行完成了,随时可以提交事务。