MySQL逻辑架构
连接层
当MySQL启动,等待客户端连接,每一个客户端连接请求,服务器都会创建一个线程处理(如果是线程池的话,则分配一个空线程),每个线程独立,拥有各自的内存处理空间。当两个线程同时修改一块内存的时候,会引发数据同步问题。
连接创立之后,服务器需要对其进行验证,一旦连接成功,还要验证是否具有执行某个特定查询的权限(例如,是否允许客户端对某个数据库某个表的某个操作)
处理层
在这一层中,有SQL接口,转换器,优化器,缓存等组件。
这一层主要功能有:解析、优化SQL语句,查询缓存,实现MySQL内置函数,跨存储引擎功能,如:存储过程,触发器,视图。
1.如果是查询语句,首先会查询缓存是否已有相应结果
思考:
MyBatis中有缓存,MySQL中同样有缓存
数据库和后端代码中的缓存在作用上有什么区别?是否重复?对性能有什么影响?
show variables like '%query_cache_type%'
缓存默认是关闭的,因为仅能缓存同样查询语句。功能可以被redis代替,且起作用的时候很少。默认1M
缓存部分有buffer(仅innodb使用)和cache两种,这篇博文写的比较详细
https://www.cnblogs.com/qiaoyanlin/p/6746791.html
1、Buffer(缓冲区)是系统两端处理速度平衡(从长时间尺度上看)时使用的。它的引入是为了减小短期内突发I/O的影响,起到流量整形的作用。比如生产者——消费者问题,他们产生和消耗资源的速度大体接近,加一个buffer可以抵消掉资源刚产生/消耗时的突然变化。
2、Cache(缓存)则是系统两端处理速度不匹配时的一种折衷策略。因为CPU和memory之间的速度差异越来越大,所以人们充分利用数据的局部性(locality)特征,通过使用存储系统分级(memory hierarchy)的策略来减小这种差异带来的影响。
2.解析查询,创建一个内部数据结构(解析树),这个解析树主要用来SQL语句的语义和语法解析
解析树的原理?实现?
3.优化:优化SQL语句,例如重写查询,决定表的读取顺序,以及选择需要的缩影等。这一阶段用户可以查询到优化器如何进行优化。即explain() 优化器会询问存储引擎,比如某个操作的开销信息,是否对特定索引有查询优化等。
子查询和inner join相比?
在这里插入图片描述