当查询进行时,如果设置了query cache,MySQL会把查询的结果保存在qc中。保存并不是在结果集完全得到的时候进行的,而是一边检索一边保存,MySQL每次会分配一块大小为query_cache_min_res_unit的内存用于保存结果集,当使用完之后再分配一块,所以如果结果集大于query_cache_min_res_unit会使得在一次查询中进行多次内存的分配。
当最后一块分配的内存没有完全使用时,MySQL会把这块内存截断,并把没有使用的那部分归还以重复利用。但是当多个query同时进行时,可能归还的部分无法和空余的内存合成连续的块而造成这部分大小小于query_cache_min_res_unit无法再分配,这样出现了无法再使用的内存碎片。一个连续的同一类型的内存块称为block,包含使用的块,也包含未使用的块。
Qcache_total_blocks 显示了所有的块数,而Qcache_free_blocks 反映了未使用的块数。如果Qcache_free_blocks很大,说明内存的碎片很多,内存的使用率会比较差,所以这时虽然Qcache_free_memory显示还有剩余的内存,也可能无法使用,当插入新的query时就需要清除旧的,使得Qcache_lowmem_prunes很高。可以使用flush query cache重整内存,操作之后Qcache_free_blocks应该为1,因为所有未使用的内存都放在一起作为连续的一块了。可以根据
query的大小调整query_cache_min_res_unit以更好地利用内存。可以使用
<verbatim>
(query_cache_size - Qcache_free_memory)/ Qcache_queries_in_cache
</verbatim>
计算query的平均大小。不过不是把query_cache_min_res_unit设得越小越好,因为频繁的分配内存会影响执行的速度。
我不知道一个query会使用几个block,对于一个刚使用qc,发现每加入一个query,block增加了2,但在一个运行的服务器上看到Qcache_queries_in_cache*2和Qcache_total_blocks要相差不少。
分享到:
相关推荐
标题中的问题涉及到的是在使用Mycat数据中间件时,尝试使用JDBC 8驱动连接到Mycat 1.6版本时遇到的一个错误:`Unknown system variable 'query_cache_size'`。这个问题出现的原因在于MySQL 8.0版本中移除了`query_...
在Laravel框架中,查询缓存(laravel-query-cache)是一种优化数据库性能的策略,它允许开发者存储查询结果,避免多次执行相同的SQL语句。这不仅提高了应用的响应速度,也减轻了数据库服务器的压力。本篇文章将深入...
Query Cache 的优点是可以存储 SELECT 语句及其产生的数据结果,特别适用于频繁提交同一个语句,并且该表数据变化不是很频繁的场景,例如一些静态页面,或者页面中的某块不经常发生变化的信息。QC 有可能会从 ...
通过监控`Qcache_queries_in_cache`(缓存中的查询数量)和`Qcache_total_blocks`(总存储块数量)可以评估Query Cache的效率。理想情况下,两者比例接近1:2,表示当前的`query_cache_min_res_unit`设置是合适的。...
Querycache (TM) 是一种智能分布式缓存,用于存储来自异构存储系统的 SQL 结果。 用户组: : user 路线图: ://docs.google....
"laravel-query-cache"项目很可能提供了一种自动化的方式来处理这个问题。可能的功能包括: 1. 自动缓存Eloquent ORM的查询结果:当使用Eloquent模型进行查询时,插件可能自动将结果缓存,无需额外的代码。 2. ...
在Laravel框架中,Query Cache Builder是一个非常实用的工具,它允许开发者将数据库查询结果缓存起来,以提高应用程序的性能。"Laravel开发-query-cache-builder"这个项目就是专门针对这个功能进行增强和优化,旨在...
MySQL的高速缓存,也称为查询缓存(Query Cache),是一种优化机制,它可以在数据库接收到相同的SELECT查询时,直接返回之前缓存的结果,而无需再次执行查询操作。这极大地提高了查询性能,尤其是在处理大量重复查询...
`laravel_duplicate_query_cache`是一个专门为解决这个问题而设计的小型库,它的目标是在一个请求生命周期内缓存重复的数据库查询,以减少不必要的计算和提高应用程序性能。 首先,我们需要理解Laravel的查询构建器...
MySQL是一个流行的开源关系型数据库管理系统(RDBMS),广泛用于Web应用程序的后端数据存储。它基于结构化查询语言(SQL)来管理数据,并且是LAMP(Linux, Apache, MySQL, PHP/Python/Perl)技术栈的一部分,这个...
SQL Query Result Cache是Oracle 11g引入的一种性能优化新技术,旨在提高数据库系统的查询效率,减少不必要的计算和I/O操作。这一特性通过缓存SQL查询的结果来避免重复执行相同的查询,从而节省系统资源。 7.1 ...
MySQL的Query Cache是一种优化机制,用于存储已执行的SQL查询及其结果,以便后续相同的查询可以直接从缓存中获取结果,而无需再次执行SQL。然而,关于Query Cache的一个常见误解是,只要查询中的任何细微差别,如多...
- **解释:** 在高并发环境下,尽管Query Cache的命中率很高,但由于请求的数量增加,导致更多的查询需要被缓存或替换现有的缓存项。这会增加Query Cache的管理开销,从而影响性能。因此,随着并发用户的增加,Query...
"Laravel开发-lada-cache"项目就是针对Laravel 5.1版本设计的一个专门的缓存解决方案,它主要利用Redis作为底层存储,提供了一个自动化且可扩展的数据库缓存层。 **Laravel缓存系统** Laravel的缓存系统是其强大...
Memcached 和 MySQL 的 query cache 都是缓存系统,但是它们有不同的设计目标和实现方式。MySQL 的 query cache 是集中式的,连接到该 query cache 的 MySQL 服务器都会受益。而 Memcached 则是一个分布式的缓存系统...
<property name="hibernate.cache.use_query_cache">true ``` 接下来,我们需要在实体类上添加`@Cacheable`注解,或者在映射文件中设置 `<cache usage="read-write|read-only|transactional"`,以声明该类应放入二...
缓存是将经常访问的数据暂存到快速存储介质上,以减少数据读取时间的技术。在WordPress中,缓存插件可以将动态生成的网页内容转化为静态HTML文件,这样当用户再次访问时,无需通过数据库查询,直接从缓存中读取,...
1. 查询结果缓存(QueryResultCache):存储查询结果文档的列表,使得相同的查询可以在不重新计算的情况下快速返回结果。这对于频繁重复的查询尤其有用,可以显著减少对索引的磁盘访问。 2. 索引碎片字段值缓存...
3. **Query Result Cache**:缓存查询结果,尤其是那些复杂的查询请求,这样在相同或类似的查询再次出现时可以直接返回缓存中的结果。 4. **Field Value Cache**:针对单个字段的缓存,有助于提高字段值的查询效率...