select缓存
‘壹’ 面试官:select语句和update语句分别是怎么执行的
深入了解sql执行过程,无论是SELECT还是UPDATE语句,都遵循了类似的流程,但具体实现存在差异。理解这些差异不仅有助于面试,更能优化SQL执行效率。
SELECT语句执行流程
执行SELECT语句时,主要分为以下几个步骤:
- 连接器: 首先校验用户名和密码,验证权限。连接成功后,权限范围内的操作才能继续。
- 检索缓存: 从缓存中查找是否执行过此SQL,缓存命中直接返回结果,未命中则继续。
- 分析器: 包括词法分析和语法分析,确定语句类型和具体操作。
- 优化器: 根据解析树生成最优执行计划,考虑使用索引、表关联顺序等。
- 执行器: 执行优化后的计划,调用存储引擎读接口,获取数据。
UPDATE语句执行流程
执行UPDATE语句时,同样经过连接器、分析器、优化器、执行器,但区别在于涉及redo log和binlog的操作。
- redo log: 先写日志,后更新内存和磁盘,提高效率。
- binlog: 记录原始SQL,用于数据恢复和复制。
关键点
在执行过程中,SELECT和UPDATE的主要区别在于对数据的访问和修改。同时,使用缓存、优化器、redo log和binlog等功能,可以显着提升SQL执行效率。理解这些技术的原理和应用,对于提升数据库性能至关重要。
综上所述,SELECT和UPDATE语句在执行流程上有相似之处,但在具体操作上存在差异,涉及的数据访问和修改方式不同。深入理解这些差异,有助于优化SQL查询和数据库性能。这一内容涉及的技术点包括缓存机制、SQL解析与优化、日志系统等,这些都是数据库管理中不可或缺的组成部分。
‘贰’ MyBatis二级缓存带来的问题
MyBatis二级缓存使用的在某些场景下会出问题,来看一下为什么这么说。
假设我有一条select语句(开启了二级缓存):
selecta.col1, a.col2, a.col3, b.col1, b.col2, b.col3fromtableA a, tableB bwherea.id= b.id;
对于tableA与tableB的操作定义在两个Mapper中,分别叫做MapperA与MapperB,即它们属于两个命名空间,如果此时启用缓存:
MapperA中执行上述sql语句查询这6个字段
tableB更新了col1与col2两个字段
MapperA再次执行上述sql语句查询这6个字段(前提是没有执行过任何insert、delete、update操作)
此时问题就来了,即使第(2)步tableB更新了col1与col2两个字段,第(3)步MapperA走二级缓存查询到的这6个字段依然是原来的这6个字段的值,因为我们从CacheKey的3组条件来看:
<select>标签所在的Mapper的Namespace+<select>标签的id属性
RowBounds的offset和limit属性,RowBounds是MyBatis用于处理分页的一个类,offset默认为0,limit默认为Integer.MAX_VALUE
<select>标签中定义的sql语句
对于MapperA来说,其中的任何一个条件都没有变化,自然会将原结果返回。
这个问题对于MyBatis的二级缓存来说是一个无解的问题,因此使用MyBatis二级缓存有一个前提: 必须保证所有的增删改查都在同一个命名空间下才行 。
‘叁’ Oracle如何清理多次select查询后在内存中的缓存数据
ALTER SYSTEM FLUSH SHARED_POOL
这个语句清除SGA中的 shared pool,shared pool存储下面的信息:
1、数据字典
2、Shared SQL & PL/SQL,存储过程、函数、包以及触发器
但是有一点要清楚的是假如这些对象正在使用时是无法清除的。