wiki/运维/数据库/MySQL/mysql笔记/Ⅱ、解析和优化.md
2025-01-02 10:46:09 +08:00

16 lines
2.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 查询缓存
MySQL服务器程序处理查询请求时会把刚刚处理过的查询请求和结果缓存起来如果下一次有一模一样的请求过来直接从缓存中查找结果
如果两个查询请求在任何字符上的不同(例如:空格、注释、大小写),都会导致缓存不会命中。另外,如果查询请求中包含某些系统函数、用户自定义变量和函数、一些系统表,如 mysql 、information_schema、 performance_schema 数据库中的表,那这个请求就不会被缓存。
MySQL的缓存系统会监测涉及到的每张表只要该表的结构或者数据被修改如对该表使用了INSERT、 UPDATE、DELETE、TRUNCATE TABLE、ALTER TABLE、DROP TABLE或 DROP DATABASE语句那使用该表的所有高速缓存查询都将变为无效并从高速缓存中删除
虽然查询缓存有时可以提升系统性能但也不得不因维护这块缓存而造成一些开销比如每次都要去查询缓存中检索查询请求处理完需要更新查询缓存维护该查询缓存对应的内存区域。从MySQL 5.7.20开始不推荐使用查询缓存并在MySQL 8.0中删除。
## 语法解析
如果查询缓存没有命中接下来就需要进入正式的查询阶段了。因为客户端程序发送过来的请求只是一段文本而已所以MySQL服务器程序首先要对这段文本做分析判断请求的语法是否正确然后从文本中将要查询的表、各种查询条件都提取出来放到MySQL服务器内部使用的一些数据结构上来。
## 查询优化
因为我们写的MySQL语句执行起来效率可能并不是很高MySQL的优化程序会对我们的语句做一些优化如外连接转换为内连接、表达式简化、子查询转为连接等等的一堆东西。优化的结果就是生成一个执行计划这个执行计划表明了应该使用哪些索引进行查询表之间的连接顺序是什么样的。我们可以使用EXPLAIN语句来查看某个语句的执行计划