目录
前言:
1.mysql的结构
2. 长连接和短连接?
2.1 长时间使用长连接会造成OOM,使内存涨得过快
3. 查询缓存(MYSQL8.0已经删除,所以只需要知道一下即可)
3.1 尽量不适用查询缓存
3.2 将查询缓存关闭
4. 分析器
5. 优化器
6. 执行器
7.总结
前言:
一般一个sql查询执行中,所经历的是连接-分析器-优化器(选择索引)-执行器 然后在进行访问存储引擎。
1.mysql的结构
连接器--管理连接,验证权限(认为是链接到这个软件上)
分析器--语法分析,词法分析(有点像自然语言处理的课程)
查询缓存--命中返回结构(涉及到mysql的4种引擎) PS: 的第十一问
优化器--执行计划,进行选择索引
执行器--操作引擎,返回结果
存出引擎--存储数据
所以,如果有人问起来mysql是包括server层和存储引擎层的。
不同的引擎公用一个server层,可以在创建表的时候指定存储引擎(比如engine=memory)
2. 长连接和短连接?
这个概念是在连接器中提到的。
尽量使用长连接,因为建立连接的过程比较复杂。
2.1 长时间使用长连接会造成OOM,使内存涨得过快
解决方法:定期断开长连接
3. 查询缓存(MYSQL8.0已经删除,所以只需要知道一下即可)
mysql一个查询请求之后,都会进行去缓存里面查找。之前执行的结果可能用key-value的形式缓存在内存中。
key是查询语句,value是查询的结果(也就类似于我们自己项目中的缓存)
如果查询不在缓存中,那么将查询放入缓存。
3.1 尽量不适用查询缓存
因为失效很频繁,只要对表进行更新,这个表所有的查询缓存都会被清空。
那么如果业务是一张静态表,比如系统配置表,可以用查询缓存。
3.2 将查询缓存关闭
将参数 query_cache_type 设置成 DEMAND
如果使用查询缓存,可以显示指定。
select SQL_CACHE * from Table;
4. 分析器
先进行词法分析,在进行语法分析。
语法分析是判断是否符合mysql语法。
5. 优化器
优化器是用来控制使用那个索引。或者join表的连接顺序。
比如两个表a,b 使用join连接
那么既可以先从表a拿数据,在根据条件找表b
也可以根据表b再找表a
执行效率不同,所以就是决定使用什么方案。
6. 执行器
不管有没有索引,都是一条一条的往后面查询,把符合条件的放到结果集。
索引是加快并且定位到合适的范围,然后在一条一条的进行查询。
7.总结
首先搜索引擎也都是调用API接口,然后去找到数据符不符合要查询的东西。