`
丁林.tb
  • 浏览: 788326 次
  • 性别: 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
分享到:
评论

相关推荐

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

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

    Apache Cassandra存储系统.rar

    一般MySQL使用Query Cache。NoSQL的Cache是记录级的,是一种细粒度的Cache,所以NoSQL在这个层面上来说性能就要高很多。 灵活的数据模型:NoSQL无须事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在...

    易语言仿TP Model的 DbModel 数据模型

    在考虑增加个"cache (缓存查询)",。2.批量插入/更新(有计划要做),。3.另外打算下次加个“表前缀", join里也可以加表前缀.这样很多地方改起来就方便了。//更新记录。2017-01-02 (测试版本)。' 1.新增] 4个统计方法sum...

    PHPCMS 2008 SP2 正式版.zip

    36、 修正了 MySQL Query : INSERT INTO `phpcms_keyword` (`tag`,`usetimes`,`lastusetime`) VALUES('启示','1','1243414371') MySQL Error : Duplicate entry '' for key 2 37、 修正了IE8 下面兼容问题 38...

    易语言-易语言仿TP Model的 DbModel 数据模型

    在考虑增加个"cache (缓存查询)", 2.批量插入/更新(有计划要做), 3.另外打算下次加个“表前缀", join里也可以加表前缀.这样很多地方改起来就方便了 //更新记录 2017-01-02 (测试版本) ' 1.新增] 4个统计方法sum(合计...

    Node.js的DAO框架bearcat-dao.zip

    仅仅需要添加 this.$prefix model 属性DAODAO 是领域对象模型的缩写,一般用于操作数据库bearcat-dao 提供 domainDaoSupport 对象,封装了基本的sql、cache操作。使用它也非常简单,直接依赖注入,然后通过 init...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    Mysql 甲骨文 是个开源的数据库server,可运行在多种平台, 特点是响应速度特别快,主要面向中小企业 中小型企业 PostgreSQL 号称“世界上最先进的开源数据库“,可以运行在多种平台下,是tb级数据库,而且性能也很...

    PhpCMS2008 SP2 build20090820 简体中文GBK

    36、修正了MySQLQuery:INSERTINTO`phpcms_keyword`(`tag`,`usetimes`,`lastusetime`)VALUES('启示','1','1243414371') MySQLError:Duplicateentry''forkey2 37、修正了IE8下面兼容问题 38、php最新版本下出现的问题...

    jpivot学习总结.doc

    在这个文件中形成逻辑模型和数据库物理模型的对应。 3.2. Cube 一个 Cube 是一系列维度 (Dimension) 和度量 (Measure) 的集合区域。在 Cube 中, Dimension 和 Measure 的共同地方就是共用一个事实表。 Cube 中的...

    PhpCMS2008 SP2 build20090820简体中文 UTF-8

    36、修正了MySQLQuery:INSERTINTO`phpcms_keyword`(`tag`,`usetimes`,`lastusetime`)VALUES('启示','1','1243414371') MySQLError:Duplicateentry''forkey2 37、修正了IE8下面兼容问题 38、php最新版本下出现的问题...

    03开源NewSql数据库TiDB-Deep Dive into TiDB

    完成上述两项改动之后,TiDB 在 OLAP 场景下的性能有了大幅的质的提升,从 TPC-H 的对比结果来看,所有的 Query 在 2.0 中都运行得更快,一些 Query 大多数都有几倍甚至数量级的提升,特别是一些 1.0 中跑不出结果的...

    SQL培训第一期

    结构化查询语言(Structured Query Language)简称SQL,是一种关系数据库查询语言,用于存取数据以及查询、更新和管理关系数据库系统。 1.2 语句结构 1.2.1 数据查询语言(DQL) 对数据库进行的信息查询,select。 ...

    spring security 参考手册中文版

    39. @Query中的安全表达式 273 第八部分 附录 274 40.安全数据库模式 274 40.1用户模式 274 40.1.1集团当局 274 40.2持久登录(记得我)架构 275 40.3 ACL模式 275 40.3.1 HyperSQL 276 40.3.2 PostgreSQL 277 40.3....

Global site tag (gtag.js) - Google Analytics