首页 > 编程知识 正文

oracle数据库缓存机制,苹果cms解析js

时间:2023-05-04 14:44:28 阅读:39917 作者:3897

一、缓存条件、原理

MySql Query Cache用于缓存我们执行的SELECT语句及其语句的结果集。 MySQL在实现Query Cache的具体技术细节上类似于典型的KV存储。 这意味着散列映射SELECT语句及其查询语句的结果集,并将其保存在一定的内存空间中。 当客户端启动SQL查询时,Query Cache的搜索逻辑是首先对SQL进行相应的权限验证,然后在Query Cache中搜索结果。 (请注意,它们必须完全相同。 至少有一个空格、大小写被视为不同,即使是完全相同的SQL,使用不同的字符集、不同的协议等也会被视为不同的查询,并分别缓存。 不需要在优化器模块中分析和优化执行计划,也不需要与存储引擎交互,而且可以减少大量磁盘I/o和CPU操作,因此可能非常高效。

查询缓存的工作流为以下:

1 :命中条件

缓存包含一个hash表,使用SQL查询、数据库查询、客户端协议等作为密钥。 在确定是否命中之前,MySQL直接使用SQL查询缓存,而不解析SQL。 SQL字符差异(如空格、注释等)会导致缓存未命中。

如果查询中存在不确定数据,如CURRENT_DATE (或NOW )函数,则在查询完成后不缓存。 因此,包含不确定性数据的查询找不到可用的缓存

2 :工作流程

服务器接收SQL,并使用SQL和其他条件作为关键字搜索缓存表。 (额外的性能消耗)。

如果找到缓存,则直接返回到缓存(提高性能) ) ) )。

如果找不到缓存,请执行原始SQL解析、优化等SQL查询。

执行SQL查询的结果后,将SQL查询的结果保存到缓存表中。 额外的性能消耗)

二.相关SQL语句

2.1、显示SQL缓存参数: showvariableslike“% query _ cache %”;

各参数的含义如下。

Qcache_free_blocks :缓存中相邻的内存块的数量。 数量多可能有碎片。 FLUSH QUERY CACHE组织缓存中的碎片并获取空闲块。 Qcache_free_memory :缓存中的可用内存。 Qcache_hits :每次查询命中缓存时增加Qcache_inserts。 每次插入一个查询时增大。 命中次数除以插入次数等于不合格率。 Qcache_lowmem_prunes :缓存内存不足,需要清理才能为更多查询提供空间的次数。 这个数字最好看很久。如果这个数字增加了,碎片可能非常严重,或者内存很少。 (上面的free_blocks和free_memory告诉我们它们属于哪一个) Qcache_not_cached :不适合缓存的查询数通常是这些查询不是SELECT语句,或者Qcache_queries_in_cache :当前缓存的查询(和响应)数。 Qcache_total_blocks :缓存中的块数。

2.2、打开SQL缓存:设置全局查询_ cache _ type=1;

2.3、关闭SQL缓存:设置全局查询_ cache _ type=0;

2.4、设置缓存空间: set global query _ cache _ size=1024 * 1024 * 64 (64m ) ) ) ) ) ) ) ) ) ) )

2.5、固定SQL语句声明不应用缓存: select sql_no_cache * from表名

注:如果更改了SQL语句的大小写,或者数据表发生了数据更改,则不会调用缓存。

2.6、查询缓存配置

vi /etc/my.cnf

query _ cache _ size=300 mquery _ cache _ type=1

三.清理现金

mysql的FLUSH语法(清除缓存)

FLUSH flush_option [,flush_option]

如果要清除某些MySQL并使用内部缓存,则必须使用FLUSH命令。 要运行FLUSH,必须具有reload权限。

flush_option可以是以下选项之一:

HOSTS这个用得最多,经常遇到。 主要用于清空主机缓存表。 如果某些主机更改了IP编号,或者收到错误消息Host . isblocked,则主机表必须为空。 连接到MySQL服务器时,特定主机连续出现的错误多于max_connect_errors,MySQL出于安全需要阻止主机的更多连接请求。 清空主机表后,主机可以重试连接。 LOGS关闭当前二进制日志文件并创建新的二进制文件。 新二进制日志文件的名称是当前二进制文件的编号加1。 所谓隐私也是经常使用的。 每次重新授予权限时,通常都会执行以立即启用新权限,以防万一。 目的地是从数据库许可证表中将权限重新加载到缓存中。 TABLES关闭所有打开的表。 同时,此操作将清空查询缓存的内容。 FLUSH TABLES WITH READ LOCK关闭

闭所有打开的表,同时对于所有数据库中的表都加一个读锁,直到显示地执行unlock tables,该操作常常用于数据备份的时候。 STATUS 重置大多数状态变量到0。 MASTER 删除所有的二进制日志索引文件中的二进制日志文件,重置二进制日志文件的索引文件为空,创建一个新的二进制日志文件,不过这个已经不推荐使用,改成reset master 了。可以想象,以前自己是多土啊,本来一条简单的命令就可以搞定的,却要好几条命令来,以前的做法是先查出来当前的二进制日志文件名,再用purge 操作。 QUERY CACHE 重整查询缓存,消除其中的碎片,提高性能,但是并不影响查询缓存中现有的数据,这点和Flush table 和Reset Query Cache(将会清空查询缓存的内容)不一样的。 SLAVE 类似于重置复制吧,让从数据库忘记主数据库的复制位置,同时也会删除已经下载下来的relay log,与Master一样,已经不推荐使用,改成Reset Slave了。这个也很有用的。

一般来讲,Flush操作都会记录在二进制日志文件中,但是FLUSH LOGS、FLUSH MASTER、FLUSH SLAVE、FLUSH TABLES WITH READ LOCK不会记录,因此上述操作如果记录在二进制日志文件中话,会对从数据库造成影响。注意:Reset操作其实扮演的是一个Flush操作的增强版的角色。

四、缓存的内存管理

缓存会在内存中开辟一块内存(query_cache_size)来维护缓存数据,其中有大概40K的空间是用来维护缓存的元数据的,例如空间内存,数据表和查询结果的映射,SQL和查询结果的映射等.

MySQL将这个大内存块分为小的内存块(query_cache_min_res_unit),每个小块中存储自身的类型,大小和查询结果数据,还有指向前后内存块的指针.

MySQL需要设置单个小存储块的大小,在SQL查询开始(还未得到结果)时就去申请一块空间,所以即使你的缓存数据没有达到这个大小,也需要用这 个大小的数据块去存(这点跟Linux文件系统的Block一样).如果结果超出这个内存块的大小,则需要再去申请一个内存块.当查询完成发现申请的内存 块有富余,则会将富余的空间释放掉,这就会造成内存碎片问题,见下图

此处查询1和查询2之间的空白部分就是内存碎片,这部分空闲内存是有查询1查询完以后释放的,假设这个空间大小小于MySQL设定的内存块大小,则无法再被使用,造成碎片问题

在查询开始时申请分配内存Block需要锁住整个空闲内存区,所以分配内存块是非常消耗资源的.注意这里所说的分配内存是在MySQL初始化时就开辟的那块内存上分配的.

五、缓存的使用时机 & 性能

衡量打开缓存是否对系统有性能提升是一个很难的话题

1. 通过缓存命中率判断, 缓存命中率 = 缓存命中次数 (Qcache_hits) / 查询次数 (Com_select)

2. 通过缓存写入率, 写入率 = 缓存写入次数 (Qcache_inserts) / 查询次数 (Qcache_inserts)

3. 通过命中-写入率 判断, 比率 = 命中次数 (Qcache_hits) / 写入次数 (Qcache_inserts), 高性能MySQL中称之为比较能反映性能提升的指数,一般来说达到3:1则算是查询缓存有效,而最好能够达到10:1

任何事情过犹不及,尤其对于某些写频繁的系统,开启Query Cache功能可能并不能让系统性能有提升,有时反而会有下降。原因是MySql为了保证Query Cache缓存的内容和实际数据绝对一致,当某个数据表发生了更新、删除及插入操作,MySql都会强制使所有引用到该表的查询SQL的Query Cache失效。对于密集写操作,启用查询缓存后很可能造成频繁的缓存失效,间接引发内存激增及CPU飙升,对已经非常忙碌的数据库系统这是一种极大的负担。

六、查询缓存问题分析

分析和配置查询缓存

总结

这里要注意Query Cache因MySql的存储引擎不同而实现略有差异,比如MyISAM,缓存的结果集存储在OS Cache中,而最流行的InnoDB则放在Buffer Pool中。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。