总体来说sqlserver分为两大部分,分为业务逻辑层和引擎层。
其中业务逻辑层包含连接器、缓存、分析器、优化器、执行器等,大部分的核心功能(存储过程、视图),所有的内置函数也都在这一层。
引擎层包含各种不同的执行引擎:myIsam 、innodb、memory等。目前默认的版本就是innodb引擎。不同的执行引擎数据的存取方式是不同的,后面再讲几个引擎的不同。
下面介绍下业务逻辑层的几大组件.
连接器
客户端连接进来后首先对接的就是连接器,连接器的功能就是跟客户端进行连接、权限验证。用户名密码通过后,就到权限表获取用户的权限。此后这个连接的权限都依赖于此时的获取的权限。
缓存
每次执行查询sql之后,sql语句和结果会以 key-value 的形式缓存在内存中.因此当同一个请求再次来的时候会从缓存中取,来提高效率,但是这个机制已经在mysq8.0中删除了。
原因如下:
当对这个表进行更新之后这个表中所有的缓存都已经失效了,因此很有可能这个缓存还没使用到就已经失效了,反而消耗cpu、内存而得不偿失。
对于那些确实修改不多的表可以使用mybatis的缓存、或者是使用spring的@cacheable来把缓存前置。把缓存前置在服务中而不是数据库这一层
分析器
首先对sql语句进行词法分析,识别出关键字。识别哪些字段代表列名哪些字段代表列数据。然后就是进行语法分析,分析这个sql是否有语法问题,如果有语法问题,就重点关注 use near 后的内容
优化器
经过分析器之后其实已经。其实mysql已经了解了你这个语法的内容,接下来就是确定查询的策略,优化器就是来确定查询的策略的。当一个表有多个索引时,优化器确定索引来执行查询。到此一个sql的执行策略已经确定。
执行器
开始执行之前,打开表查找引擎的定义,调用引擎的相应接口。获取相应的数据。
执行引擎
不同的执行引擎有着不同的存取数据结构,后面会解析不同的执行引擎