`
丁林.tb
  • 浏览: 798078 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

MySQL 中 QueryCache 的锁模型

阅读更多

    有同学在问 MySQL中 QueryCache(QC)的锁是 “全局锁”还是 “表锁”。这里简要说明一下。

 

1、  QC基本概念

    这个是实现在MySQL层(非引擎层)的一个内存结构,基本规则是将满足一定条件的查询结果缓存在内存中,若同样的查询再执行第二次,而且缓存没有失效,则可以直接返回查询结果,无需到引擎获取数据。

 

几个说明:

a) QC的结构是hash,key为查询字符串的原文,因此若想命中QC,要求查询语句与之前的一模一样,包括大小写必须一致、不能增减空格等等。

b) Qc可以缓存一个表中的多个查询语句和结果。

c) 对一个表的DML或DDL操作都会将与这个表有关的缓存都从QC中删除。

 

 2、  锁模型

 

    于是说到锁的粒度。整个QC在内存中只有一个实例Query_cache query_cache;

我们来看上面c中说到的失效逻辑的部分代码

void Query_cache::invalidate_table(THD *thd, uchar * key, uint32 key_length) 
{
  DEBUG_SYNC(thd, “wait_in_query_cache_invalidate1″);

  lock();

  DEBUG_SYNC(thd, “wait_in_query_cache_invalidate2″); 

  if (query_cache_size > 0) 
    invalidate_table_internal(thd, key, key_length);

  unlock(); 
} 

  

 

 

    可以看到这里lock()没有参数,函数内部用一额全局信号量COND_cache_status_changed,来控制。

    因此即使两个dml更新的是不同的表,也会由于都要失效本表在QC中的缓存项而互锁。

因此是“全局锁”。

 

 3、锁策略

 

    得到上述结论后我们有点担心,作为一个全局变量,是否也会锁住“查询”。试想如果我们在作一个DDL时,需要失效这个表的缓存项,而这个锁的时间就会持续很长。 这期间其他表的普通查询,是否也会受影响。 如果是,这个损失太大了。

 

    我们知道,查询过程中的对QC的访问包含两部分 :查询开始之前从QC中判断当前Query的结果是否已经缓存; 若没有,则查询执行完成后,(可能)需要将这个结果插入到QC中。

 

    这两个操作都其实也都需要对QC加锁。这样说来, 这个锁的频度如此之高,以至于我们会担心是否会得不偿失?

 

    更新时失效缓存项是必要的操作,但查询时对QC的操作则不是必须的。MySQL中使用try_lock的策略。简单来说,就是在上面的两个阶段中,试图去加锁,若超时,则放弃。

 

     这个超时时间写死在代码中是50ms,所以若一个 查询期间的两次对QC的操作都出现锁超时,则这个查询会额外耗费100ms的时间。

 

     当然若是dml操作需要失效QC中的项,而碰上锁等待,就必须等了。

 

4、小结

 

    从上面描述中可以得出一些结论,对于更新操作比较小的服务,开启QC的效果会不错,因为查询期间使用的try_lock策略使得不会出现查询在QC阶段互锁的问题。(这个50ms如果觉得太大,可以在源码中去掉个0)。

 

   当然若是更新频繁的表,还是建议关闭QC。现在主干版本上用参数关闭QC不够彻底,还是会有一些cpu消耗。有兴趣的同学可以看 这篇

1
1
分享到:
评论

相关推荐

    mysql基础知识和mysql优化整理

    4. 关系模型:MySQL基于关系数据库模型,强调数据之间的关联性。通过主键和外键可以实现表与表之间的连接操作。 5. 索引:索引是一种特殊的数据结构,用于提高查询速度。常见的索引类型有B-Tree索引、Hash索引、...

    MySQL VS ORACLE.pdf

    MySQL通过Query Cache来提升查询性能,而Oracle在数据库层面提供了更高级别的并发处理支持。 在开发方面,MySQL主要通过存储过程和函数实现代码的复用和逻辑处理,但不支持DDL触发器。Oracle支持更为丰富的对象类型...

    mysql-5.6.46-win32.zip

    此外,还有Query Cache的改进,使得数据库能够更快地响应重复的SELECT查询。 对于C++开发者来说,MySQL提供了一个名为MySQL Connector/C++的API,它允许C++应用程序直接与MySQL服务器通信。这个库遵循JDBC(Java ...

    mysql5.7源代码

    虽然在MySQL 5.7中已弃用,但了解`sql/query_cache.*`可以帮助理解如何存储和检索已解析并执行过的查询结果。 9. **触发器与存储过程** `sql/sp_head.*`和`sql/sp_rcontext.*`涉及到存储过程和触发器的编译和执行...

    MySQL面试题资源整理

    MySQL的Query Cache和InnoDB Buffer Pool有什么区别? 7. **安全性** - 用户权限管理:GRANT和REVOKE命令的使用。 - 如何设置和管理MySQL的强密码策略? - 角色(Role)在MySQL权限管理中的应用。 8. **复制与...

    MySQL® Database Design and Tuning

    对于**MySQL的调优**,将详细讨论系统变量的调整,如innodb_buffer_pool_size、query_cache_size等,以及如何根据服务器硬件资源进行合理配置。还会涉及性能监视工具的使用,如MySQL Enterprise Monitor或Percona ...

    mysql-5.5.50-winx64.rar

    通过调整innodb_buffer_pool_size、query_cache_size、thread_cache_size等参数,以及优化查询语句,可以显著提升系统性能。 总之,MySQL 5.5.50-winx64是一个强大且灵活的数据库解决方案,适用于需要处理大量数据...

    JAVA_memcached面试专题.pdf

    - MySQL Query Cache在多核CPU上可能存在扩展性问题,因为需要全局锁来刷新缓存。 - 缺乏对任意数据的存储灵活性,限制了其应用场景。 引入Memcached到应用程序中确实需要一些额外的工作,但其带来的性能提升和可...

    MySQL5.1性能调优与架构设计.mobi

    如MySQL Schema设计的技巧,Query语句的性能优化方式方法及MySQL Server中SQL层和存储引擎层的优化思路。同时还分析了MySQL数据库中主要存储引擎的锁定机制 ●架构设计篇则主要以设计一个高可用可扩展的分布式企业级...

    mysql-5.7.38-linux-glibc2.12-x86_64.tar.gz

    5. **性能优化**:MySQL 5.7引入了Query Cache的替代品——Query Performance Interpreter (QPI),提高了查询执行效率。另外,通过Optimistic Parallel Insert和更好的索引合并策略,提升了并发插入性能。 6. **...

    MySQL性能调优与架构设计(带目录).zip

    - 内存管理:探讨缓冲池(Buffer Pool)、查询缓存(Query Cache)的设置和调整。 - 锁机制:分析不同类型的锁(如行级锁、表级锁、MVCC)及其应用场景。 - 并发控制:讲解并发环境下如何处理死锁,优化InnoDB的...

    mysql5.5低版本版本

    - **Query Cache改进**:查询缓存大小可动态调整,并且能够根据内存使用情况进行自动清理。 **7. 高可用性和灾难恢复** - **Binary Logging**:日志格式改进,支持压缩和二进制日志的在线重命名。 - **Pseudo-Grid ...

    MySQL性能调优与架构设计--全册

    2. **内存管理**:了解MySQL如何使用内存是调优的重要环节,如缓冲池(InnoDB Buffer Pool)、查询缓存(Query Cache)和排序区等。调整这些参数可以显著提升性能,但需注意内存过多可能导致系统资源浪费。 3. **...

    mysql 5.1中文版

    MySQL 5.1是MySQL数据库管理系统的一个重要版本,它在MySQL系列中占据着承上启下的地位,提供了许多新特性和改进,对于学习和使用数据库系统的人来说,了解其功能和用法至关重要。以下是对MySQL 5.1及其相关知识点的...

    Mysql数据库性能优化

    - 优化配置还包括调整`max_connections`(最大连接数)、`thread_cache_size`(线程缓存大小)和`query_cache_size`(查询缓存大小)等,以适应应用的需求。 2. **索引优化**: - 索引是提升查询速度的关键。合理...

    MySQL精选问答五百题,快来看看自己到哪层了,内含解析

    `query_cache_size`参数在MySQL 8.0版本后已被废弃,若要关闭查询缓存,设置`query_cache_size=0`和`query_cache_type=OFF`均可,但设置`query_cache_type`可能更为简洁。 临时内存主要用于排序和变量存储,在长...

    linux+tomcat+mysql+solr调优

    - **查询缓存**:`query_cache_size`设置查询缓存的大小,`query_cache_type`控制是否启用查询缓存。 - **最大连接数**:`max_connections`定义了数据库可以同时接收的最大连接数。 - **字符集**:设置数据库使用的...

    2分超清-带标签《高性能Mysql》第三版

    3. **性能监控与调优**:书中提供了监控MySQL性能的方法,如使用性能 schema 和EXPLAIN命令,以及如何调整系统参数以提高性能,如innodb_buffer_pool_size和query_cache_size等。 4. **复制技术**:MySQL的复制功能...

Global site tag (gtag.js) - Google Analytics