MySQL缓存之Qcache与buffer pool对比
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对比的更多相关文章
- 【大白话系统】MySQL 学习总结 之 缓冲池(Buffer Pool) 的设计原理和管理机制
一.缓冲池(Buffer Pool)的地位 在<MySQL 学习总结 之 InnoDB 存储引擎的架构设计>中,我们就讲到,缓冲池是 InnoDB 存储引擎中最重要的组件.因为为了提高 M ...
- 【大白话系统】MySQL 学习总结 之 缓冲池(Buffer Pool) 如何支撑高并发和动态调整
如果大家对我的 [大白话系列]MySQL 学习总结系列 感兴趣的话,可以点击关注一波. 一.上节回顾 在上节< 缓冲池(Buffer Pool) 的设计原理和管理机制>中,介绍了缓冲池整体 ...
- MySQL中读页缓冲区buffer pool
Buffer pool 我们都知道我们读取页面是需要将其从磁盘中读到内存中,然后等待CPU对数据进行处理.我们直到从磁盘中读取数据到内存的过程是十分慢的,所以我们读取的页面需要将其缓存起来,所以MyS ...
- innodb buffer pool相关特性
背景 innodb buffer pool作为innodb最重要的缓存,其缓存命中率的高低会直接影响数据库的性能.因此在数据库发生变更,比如重启.主备切换实例迁移等等,innodb buffer po ...
- MySQL -- Innodb中的change buffer
change buffer是一种特殊的数据结构,当要修改的辅助索引页不在buffer pool中时,用来cache对辅助索引页的修改.对辅助索引页的操作可能是insert.update和delete操 ...
- MySql 缓冲池(buffer pool) 和 写缓存(change buffer) 转
应用系统分层架构,为了加速数据访问,会把最常访问的数据,放在缓存(cache)里,避免每次都去访问数据库. 操作系统,会有缓冲池(buffer pool)机制,避免每次访问磁盘,以加速数据的访问. M ...
- 【MySQL】mysql buffer pool结构分析
转自:http://blog.csdn.net/wyzxg/article/details/7700394 MySQL官网配置说明地址:http://dev.mysql.com/doc/refman/ ...
- Mysql缓存中innodb_buffer_pool与Qcache的区别
innodb buffer pool和Qcache的缓存区别? 1.Qcacche缓存的是SQL语句及对应的结果集,缓存在内存,最简单的情况是SQL一直不重复,那Qcache的命令率肯定是0; 2.b ...
- [转]MySQL innodb buffer pool
最近在对公司的 MySQL 服务器做性能优化, 一直对 innodb 的内存使用方式不是很清楚, 乘这机会做点总结. 在配置 MySQL 的时候, 一般都会需要设置 innodb_buffer_poo ...
随机推荐
- iOS安全攻防之代码混淆
iOS 代码安全之代码混淆实践: 前言: 在8月份的时候写了个关于 class-dump 反编译的文章(使用 Class-dump 反编译),利用 class-dump 工具可以反编译出工程的头文件, ...
- js继承之借用构造函数继承
我的上一篇文章介绍了,原型链继承模式.但是单纯的原型链模式并不能很好地实现继承. 一.原型链的缺点 1.1 单纯的原型链继承最大的一个缺点,来自于原型中包含引用类型的值. 本来,我们没有通过原型链实现 ...
- salesforce零基础学习(七十二)项目中的零碎知识点小总结(一)
项目终于告一段落,虽然比较苦逼,不过也学到了好多知识,总结一下,以后当作参考. 一.visualforce标签中使用html相关的属性使用 曾经看文档没有看得仔细,导致开发的时候走了一些弯路.还好得到 ...
- Promise (2) 基本方法
"I'm Captain Jack Sparrow" 加勒比海盗5上映,为了表示对杰克船长的喜爱,昨天闪现了几次模仿船长的走路姿势(哈哈哈,简直妖娆). 为了周天能去看电影,要赶紧 ...
- D. 实验室传染病
D. 实验室传染病 题意 给出 n 个人的位置,以及每个人的传染范围,当一个人患病时,他的传染范围内(包括边界上)的人全部会被感染并继续向外传播. 求以每个人为传染源最多有多少人被感染. 分析 首先二 ...
- Docker化tomcat 并且使用maven热部署
今天没事干 就把自己的tomcat docker化并且使用maven实现热部署 特别记录一下~ 1.首先进行centos7的安装 就不在记录了 注意的是最好使用centos7 因为docker 依赖 ...
- NodeMCU入门(4):搭建Web服务器,配置网络连接
准备工作 1.NodeMCU模块 2.ESPlorer v0.2.0-rc6 3.NodeMCU-HTTP-Server 搭建web服务器 下载https://github.com/wangzexi/ ...
- js获取地址栏某个参数
一.获取单个参数: 若地址栏URL为:abc.html?id=123 function getString(){ var locurl=location.href; var sta ...
- node.js零基础详细教程(5):express 、 路由
第五章 建议学习时间4小时 课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑. ...
- shell多进程
之前需要多进程程序都是python实现,闲来无事弄了下shell多进程,发现so easy(笑哭) 代码上: #!/bin/bash sleep 10 & sleep 5& wait ...