Q:innodb buffer pool和Qcache的缓存区别?

A:

  1、Qcacche缓存的是SQL语句及对应的结果集,缓存在内存,最简单的情况是SQL一直不重复,那Qcache的命令率肯定是0;

  2、buffer pool中缓存的是整张表中的数据,缓存在内存,SQL再变只要数据都在内存,那么命中率就是100%。

一、查询缓存(QueryCache)

1、关于查询缓存机制

  开启了缓存,会自动将查询语句和结果集返回到内存,下次再查直接从内存中取;

  查询缓存会跟踪系统中每张表,若表发生变化,则和该张表相关的所有查询缓存全部失效,这是和buffer pool缓存机制很大的区别;

  检查查询缓存时,MYSQL不会对SQL做任何处理,它精确的使用客户端传来的查询,只要字符大小写或注释有点不同,查询缓存就认为是不同的查询;

  任何一个包含不确定的函数(比如now()、curren_date())的查询不会被缓存。

注意:

  查询缓存可改善性能,但是开启查询缓存对读写增加了额外开销。

  1、对于读,在查询前需先检查缓存;

  2、对于写,写入后需更新缓存。

  一般情况下这些开销相对较小,因此需要根据业务权衡是否开启查询缓存。

2、Qcache参数

mysql> show variables like '%query_cache%';
+------------------------------+---------+
| Variable_name | Value |
+------------------------------+---------+
| have_query_cache | YES |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 1048576 |
| query_cache_type | OFF |
| query_cache_wlock_invalidate | OFF |
+------------------------------+---------+

参数解析:

  1、have_query_cache:该MySQL是否支持Query Cache;

  2、query_cache_limit:缓存块大小,超过该大小不会被缓存

  3、query_cache_min_res_unit:每个qcache最小的缓存空间大小

  4、query_cache_size:分配给查询缓存的总内存

  5、query_cache_type:是否开启查询缓存

  6、query_cache_wlock_invalidate:控制当有锁加在表上的时候,是否先让该表相关的 Query Cache失效

3、配置查询缓存:在配置文件中修改如下参数

  query_cache_type = on  #开启查询缓存

  query_cache_size = 200M  #分配给查询缓存的总内存,一般建议不超过256M

  query_cache_limit = 1M  #限制MySQL存储的最大结果;如果查询的结果比limit大,那么就不会被缓存。

4、监控Qcache使用情况

mysql> show status like 'qcache%';
+-------------------------+---------+
| Variable_name | Value |
+-------------------------+---------+
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 1031832 |
| Qcache_hits | 0 |
| Qcache_inserts | 0 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 5476 |
| Qcache_queries_in_cache | 0 |
| Qcache_total_blocks | 1 |
+-------------------------+---------+

解析:

  1、Qcache_free_blocks :Query Cache中目前还有多少剩余的blocks。如果该值显示较大,则说明Query Cache中的内存碎片较多了,可能需要寻找合适的机会进行整理。处理办法:mysql> FLUSH QUERY CACHE;清理查询缓存碎片以提高内存使用性能。(该语句不从缓存中移出任何查询)

  2、Qcache_free_memory:Query Cache 中目前剩余的内存大小

  3、Qcache_hits:缓存命中次数

  4、Qcache_inserts:多少次未命中然后插入

Query Cache命中率 = Qcache_hits /(Qcache_hits + Qcache_inserts)

  5、Qcache_lowmem_prunes:多少条Query 因为内存不足而被清除出Query

  6、Qcache_not_cached:因为query_cache_type的设置off或者不能被cache的Query的数量

  7、Qcache_queries_in_cache:当前Query Cache中cache的Query数量

  8、Qcache_total_blocks:当前Query Cache中的block数量

注:

  命中率低,说明没从内存中取,还是从磁盘取,则多走了一步。看是否sql老变还是什么问题;

  Qcache_not_cached 数值大,开启了查询缓存没有缓存的数据则说明设置缓存的大小太小了,好多无法缓存。

二、存储引擎层-innodb buffer pool

  buffer pool是innodb存储引擎带的一个缓存池,查询数据的时候,它首先会从内存中查询,如果内存中存在的话,直接返回,从而提高查询响应时间。Buffer pool是设置的越大越好,一般设置为服务器物理内存的70%。

1、Innodb_buffer_pool参数

mysql> show variables like '%innodb_buffer_pool%';
+-------------------------------------+----------------+
| Variable_name | Value |
+-------------------------------------+----------------+
| innodb_buffer_pool_chunk_size | 134217728 |
| innodb_buffer_pool_dump_at_shutdown | ON |
| innodb_buffer_pool_dump_now | OFF |
| innodb_buffer_pool_dump_pct | 25 |
| innodb_buffer_pool_filename | ib_buffer_pool |
| innodb_buffer_pool_instances | 1 |
| innodb_buffer_pool_load_abort | OFF |
| innodb_buffer_pool_load_at_startup | ON |
| innodb_buffer_pool_load_now | OFF |
| innodb_buffer_pool_size | 134217728 |
+-------------------------------------+----------------+

参数解析:

  1、innodb_buffer_pool_size:Innodb_buffer_pool的大小

  2、innodb_buffer_pool_filename :热数据文件名称

  3、innodb_buffer_pool_dump_now:默认是OFF;如果开启则立刻InnoDB将InnoDB缓冲池中的热数据保存到本地硬盘。(组合innodb_buffer_pool_load_now使用)

  4、innodb_buffer_pool_load_now:默认是OFF;如果开启则立刻通过加载数据页预热innodb缓冲池。

  5、innodb_buffer_pool_load_at_startup:默认是OFF;如果开启该参数,启动MySQL服务时,MySQL将本地热数据加载到InnoDB缓冲池中。

  6、innodb_buffer_pool_dump_at_shutdown:默认是OFF;如果开启该参数,停止mysq服务时是否自动保存InnoDB buffer pool中热数据。

Q:如何快速重启使用数据库---Preloading the InnoDB Buffer Pool for Faster Restart

A:

  开启innodb_buffer_pool_load_at_startup、innodb_buffer_pool_dump_at_shutdown参数。重启数据库,停止时保存热数据,启动时加载热数据到buffer pool。

2、Innodb_buffer_pool状态

mysql> show status like '%innodb_buffer_pool%';
+---------------------------------------+--------------------------------------------------+
| Variable_name | Value |
+---------------------------------------+--------------------------------------------------+
| Innodb_buffer_pool_dump_status | Dumping of buffer pool not started |
| Innodb_buffer_pool_load_status | Buffer pool(s) load completed at 170430 7:07:12 |
| Innodb_buffer_pool_resize_status | |
| Innodb_buffer_pool_pages_data | 241 |
| Innodb_buffer_pool_bytes_data | 3948544 |
| Innodb_buffer_pool_pages_dirty | 0 |
| Innodb_buffer_pool_bytes_dirty | 0 |
| Innodb_buffer_pool_pages_flushed | 176 |
| Innodb_buffer_pool_pages_free | 7951 |
| Innodb_buffer_pool_pages_misc | 0 |
| Innodb_buffer_pool_pages_total | 8192 |
| Innodb_buffer_pool_read_ahead_rnd | 0 |
| Innodb_buffer_pool_read_ahead | 0 |
| Innodb_buffer_pool_read_ahead_evicted | 0 |
| Innodb_buffer_pool_read_requests | 53710 |
| Innodb_buffer_pool_reads | 201 |
| Innodb_buffer_pool_wait_free | 0 |
| Innodb_buffer_pool_write_requests | 45242 |
+---------------------------------------+--------------------------------------------------+

  Innodb_buffer_pool_read_requests  #逻辑读(缓存读)请求次数,也是读的请求次数

  Innodb_buffer_pool_reads  #从物理磁盘中获取到数据的次数

注:

  逻辑读就是从buffer pool的读,但是也会包含物理读,因为物理读也要是先将从disk中读取的数据放入buffer pool里,然后再进行逻辑读。所以:总的逻辑读也就是读的请求次数。

读的命中率=(Innodb_buffer_pool_read_requests- Innodb_buffer_pool_reads)/ Innodb_buffer_pool_read_requests

MySQL缓存之Qcache与buffer pool对比的更多相关文章

  1. 【大白话系统】MySQL 学习总结 之 缓冲池(Buffer Pool) 的设计原理和管理机制

    一.缓冲池(Buffer Pool)的地位 在<MySQL 学习总结 之 InnoDB 存储引擎的架构设计>中,我们就讲到,缓冲池是 InnoDB 存储引擎中最重要的组件.因为为了提高 M ...

  2. 【大白话系统】MySQL 学习总结 之 缓冲池(Buffer Pool) 如何支撑高并发和动态调整

    如果大家对我的 [大白话系列]MySQL 学习总结系列 感兴趣的话,可以点击关注一波. 一.上节回顾 在上节< 缓冲池(Buffer Pool) 的设计原理和管理机制>中,介绍了缓冲池整体 ...

  3. MySQL中读页缓冲区buffer pool

    Buffer pool 我们都知道我们读取页面是需要将其从磁盘中读到内存中,然后等待CPU对数据进行处理.我们直到从磁盘中读取数据到内存的过程是十分慢的,所以我们读取的页面需要将其缓存起来,所以MyS ...

  4. innodb buffer pool相关特性

    背景 innodb buffer pool作为innodb最重要的缓存,其缓存命中率的高低会直接影响数据库的性能.因此在数据库发生变更,比如重启.主备切换实例迁移等等,innodb buffer po ...

  5. MySQL -- Innodb中的change buffer

    change buffer是一种特殊的数据结构,当要修改的辅助索引页不在buffer pool中时,用来cache对辅助索引页的修改.对辅助索引页的操作可能是insert.update和delete操 ...

  6. MySql 缓冲池(buffer pool) 和 写缓存(change buffer) 转

    应用系统分层架构,为了加速数据访问,会把最常访问的数据,放在缓存(cache)里,避免每次都去访问数据库. 操作系统,会有缓冲池(buffer pool)机制,避免每次访问磁盘,以加速数据的访问. M ...

  7. 【MySQL】mysql buffer pool结构分析

    转自:http://blog.csdn.net/wyzxg/article/details/7700394 MySQL官网配置说明地址:http://dev.mysql.com/doc/refman/ ...

  8. Mysql缓存中innodb_buffer_pool与Qcache的区别

    innodb buffer pool和Qcache的缓存区别? 1.Qcacche缓存的是SQL语句及对应的结果集,缓存在内存,最简单的情况是SQL一直不重复,那Qcache的命令率肯定是0; 2.b ...

  9. [转]MySQL innodb buffer pool

    最近在对公司的 MySQL 服务器做性能优化, 一直对 innodb 的内存使用方式不是很清楚, 乘这机会做点总结. 在配置 MySQL 的时候, 一般都会需要设置 innodb_buffer_poo ...

随机推荐

  1. iOS安全攻防之代码混淆

    iOS 代码安全之代码混淆实践: 前言: 在8月份的时候写了个关于 class-dump 反编译的文章(使用 Class-dump 反编译),利用 class-dump 工具可以反编译出工程的头文件, ...

  2. js继承之借用构造函数继承

    我的上一篇文章介绍了,原型链继承模式.但是单纯的原型链模式并不能很好地实现继承. 一.原型链的缺点 1.1 单纯的原型链继承最大的一个缺点,来自于原型中包含引用类型的值. 本来,我们没有通过原型链实现 ...

  3. salesforce零基础学习(七十二)项目中的零碎知识点小总结(一)

    项目终于告一段落,虽然比较苦逼,不过也学到了好多知识,总结一下,以后当作参考. 一.visualforce标签中使用html相关的属性使用 曾经看文档没有看得仔细,导致开发的时候走了一些弯路.还好得到 ...

  4. Promise (2) 基本方法

    "I'm Captain Jack Sparrow" 加勒比海盗5上映,为了表示对杰克船长的喜爱,昨天闪现了几次模仿船长的走路姿势(哈哈哈,简直妖娆). 为了周天能去看电影,要赶紧 ...

  5. D. 实验室传染病

    D. 实验室传染病 题意 给出 n 个人的位置,以及每个人的传染范围,当一个人患病时,他的传染范围内(包括边界上)的人全部会被感染并继续向外传播. 求以每个人为传染源最多有多少人被感染. 分析 首先二 ...

  6. Docker化tomcat 并且使用maven热部署

    今天没事干 就把自己的tomcat  docker化并且使用maven实现热部署 特别记录一下~ 1.首先进行centos7的安装 就不在记录了 注意的是最好使用centos7 因为docker 依赖 ...

  7. NodeMCU入门(4):搭建Web服务器,配置网络连接

    准备工作 1.NodeMCU模块 2.ESPlorer v0.2.0-rc6 3.NodeMCU-HTTP-Server 搭建web服务器 下载https://github.com/wangzexi/ ...

  8. js获取地址栏某个参数

    一.获取单个参数: 若地址栏URL为:abc.html?id=123 function getString(){      var locurl=location.href;      var sta ...

  9. node.js零基础详细教程(5):express 、 路由

    第五章 建议学习时间4小时  课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑. ...

  10. shell多进程

    之前需要多进程程序都是python实现,闲来无事弄了下shell多进程,发现so easy(笑哭) 代码上: #!/bin/bash sleep 10 & sleep 5& wait ...