几个参数

  query_cache_type:为ON时开启,为OFF关闭,为DEMAND时则只有查询语句中有sql cache时才使用缓存

  query_cache_size: 缓存的内存空间

  query_cache_min_res_unit: 分配内存块的最小单位

  query_cache_limit:缓存可使用的内存最大值

缓存使用及注意

  在使用上缓存后,对于select语句:首先去缓存里查询是否有对应的缓存,具体是根据sql语句和作用的表生成一个key,去内存取值;如果这个key没有缓存,则执行sql语句,再把结果存到缓存中。

  对于增删改语句:执行完增删改语句后,要记录好这些语句影响的表,再去缓存空间中找到从这些表拿到的缓存结果,将这些缓存结果置为失效。

  注意:

    1.  若select中有不确定函数,则用不上缓存。如current_data,因为这个函数的值时刻变化,缓存没有意义

    2. 内存分配要合理,太小影响缓存结果,太大会导致 os 僵死

    3. 内存分配最小单位要设置合理,调小点有利于减少内存碎片,但太小影响分配效率

    4. 缓存也是有很多开销的,如查找,更新,置为失效缓存,以及使用内存时的互斥信号量。要衡量开销与收益

    5. 缓存绝对不适合写多读少的场景,这会频频把缓存置为失效

InnoDB的缓存实现特点

  前面的总结中也提到了InnoDB的MVCC机制,是一种变种的行级锁,这里就不详细介绍了。由于MVCC机制,事务不能使用创建事务ID在自己后面的行的缓存。举个例子:首先是有事务1、2、3、4对某个行进行查询,但由于某些原因他们执行被阻塞,这时事务5也来查询这个行并且成功了,然后把结果缓存起来。但是事务1,2,3,4再继续执行时是不能直接从缓存中拿这个行的,因为这个行的事务标记是晚于他们的事务5,事务1,2,3,4必须老实去执行 sql 语句。

  实际上和MVCC机制下的数据读取类似:为了防止不可重复读,只读创建事务ID晚于自己的行。

建议

  1.  缓存也是有开销的,如果是写多读少的场景,不要用缓存。只有读多,且读操作比较耗时才考虑缓存。

  2. 可以考虑使用专门的表存储某些结果,例如某些统计数字。

  3. 尽量用客户端缓存,这样缓存就与关系数据库无关;缓存数据库和关系数据库分离,不用读写行时维护缓存,操作起来更快。

最新文章

  1. .net面试(汇总2)
  2. YII实现Memcache故障转移的配置办法
  3. Swift Tips - 在 Swift 中自定义下标访问
  4. PE文件结构详解
  5. PHP 数组转字符串,与字符串转数组
  6. Js判断来访问者的系统
  7. (Problem 34)Digit factorials
  8. ios 渐进淡出
  9. 谷歌统计使用代码部署和事件API使用
  10. Xamarin.Forms 开发IOS、Android、UWP应用
  11. 2015-2016 ACM-ICPC, NEERC, Southern Subregional Contest I Lottery
  12. MacBook 最近发现的一些问题和技巧
  13. 学习之路-->大小文件读取并分页展示
  14. js面向对象自定义MyString()的构造器函数,实现内建String()属性和方法:
  15. Spring扩展自定义的XML标签
  16. 从9x9矩阵中抽取中间菱形区域打印 - perl
  17. 【SP26073】DIVCNT1 - Counting Divisors 题解
  18. C程序的编译与链接
  19. MySql使用笔记
  20. 微信小程序选择并上传图片

热门文章

  1. [VBA]删除多余工作表
  2. 阶段3 1.Mybatis_09.Mybatis的多表操作_6 分析mybatis多对多的步骤并搭建环境
  3. Python学习之==>常用模块
  4. html不点击提交,自动post
  5. oracle-只读数据文件的备份与恢复
  6. java中的命名规则
  7. 20191112 Spring Boot官方文档学习(4.4)
  8. Mailx安装与使用
  9. [转帖]22款让Kubernetes锦上添花的开源工具
  10. Python3 AES加解密(AES/ECB/PKCS5Padding)