一条 sql 查询语句的执行过程
- 客户端(client)通过连接器(Connection Handing & net I/O)连接到 MySQL 服务器。
- 如果服务器开启了查询缓存,则去检查缓存(Query Cache),如果缓存中有结果集,则直接返回结果集。
- MySQL 通过语法解析器(Parser)对 SQL 语句进行解析,它将使用 MySQL 语法规则对解析树进行验证和解析,例如验证是否使用错误的关键字、使用关键字的顺序是否正确,或者字符串上面的引号有没有闭合等。
- 查询优化器(Optimizer)负责根据解析树生成一个最优的查询计划。
- 运行查询计划,通过存储引擎接口(Pluggable Storage Engine API)进行查询。
- 将结果集返回给客户端,如果开启了查询缓存,则缓存结果集。
注:MySQL 8.0 将不再支持查询缓存。
查询缓存的弊端:
- MySQL 会检查查询缓存,进行大小写敏感的哈希查找。查找规则比较严格,即使查询和缓存中的查询只有一个字节的差异,也表示不匹配,查询就会进入下一阶段。
- 缓存失效频率高:查询缓存系统会跟踪查询中涉及的每个表,如果这些表的结构或数据发生了改变(INSERT、 UPDATE、DELETE、TRUNCATE TABLE、ALTER TABLE、DROP TABLE或 DROP DATABASE),那么和这个表相关的所有缓存数据都将失效。
参考 《 MySQL DBA 修炼之道》
图片来自 原文