MySQL缓存命中率概述

news/2024/7/5 18:34:23

 工作原理:

查询缓存的工作原理,基本上可以概括为: 缓存SELECT操作或预处理查询(注释:5.1.17开始支持)的结果集和SQL语句; 新的SELECT语句或预处理查询语句,先去查询缓存,判断是否存在可用的记录集,判断标准:与缓存的SQL语句,是否完全一样,区分大小写;

查询缓存对什么样的查询语句,无法缓存其记录集,大致有以下几类:

1、 查询语句中加了SQL_NO_CACHE参数;

2、查询语句中含有获得值的函数,包涵自定义函数,如:CURDATE()、GET_LOCK()、RAND()、CONVERT_TZ等;

3、 对系统数据库的查询:mysql、information_schema 查询语句中使用SESSION级别变量或存储过程中的局部变量;

4、查询语句中使用了LOCK  IN SHARE MODE、FOR UPDATE的语句 查询语句中类似SELECT …INTO 导出数据的语句; 

5、对临时表的查询操作; 存在警告信息的查询语句; 不涉及任何表或视图的查询语句; 某用户只有列级别权限的查询语句;

6、 事务隔离级别为:Serializable情况下,所有查询语句都不能缓存;

 

配置

是否启用mysql查询缓存,可以通过2个参数:query_cache_type和query_cache_size,其中任何一个参数设置为0都意味着关闭查询缓存功能。

query_cache_type 值域为:

0(OFF):关闭 Query Cache 功能,任何情况下都不会使用 Query Cache;

1(ON): 启用查询缓存,只要符合查询缓存的要求,客户端的查询语句和记录集斗可以 缓存起来,共其他客户端使用;

2(DEMAND):  启用查询缓存,只要查询语句中添加了参数:sql_cache,且符合查询缓存的要求,客户端的查询语句和记录集,则可以缓存起来,共其他客户端使用;

query_cache_size 允许设置query_cache_size的值最小为40K,对于最大值则可以几乎认为无限制,实际生产环境的应用经验告诉我们,该值并不是越大, 查询缓存的命中率就越高,也不是对服务器负载下降贡献大,反而可能抵消其带来的好处,甚至增加服务器的负载,至于该如何设置,下面的章节讲述,推荐设置 为:64M;建议设置不要超过256MB

 

缓存选项的说明:

用show global status like 'QCache%';查看

mysql> show global status like 'QCache%';
+-------------------------+---------+
| Variable_name           | Value   |
+-------------------------+---------+
| Qcache_free_blocks      | 1       |
| Qcache_free_memory      | 1031368 |
| Qcache_hits             | 0       |
| Qcache_inserts          | 0       |
| Qcache_lowmem_prunes    | 0       |
| Qcache_not_cached       | 83      |
| Qcache_queries_in_cache | 0       |
| Qcache_total_blocks     | 1       |
+-------------------------+---------+
8 rows in set (0.02 sec)

 

Qcache_free_blocks:目前还处于空闲状态的 Query Cache 中内存 Block 数目

Qcache_free_memory:目前还处于空闲状态的 Query Cache 内存总量

Qcache_hits:Query Cache 命中次数

Qcache_inserts:向 Query Cache 中插入新的 Query Cache 的次数,也就是没有命中的次数

Qcache_lowmem_prunes:当 Query Cache 内存容量不够,需要从中删除老的 Query Cache 以给新的 Cache 对象使用的次数

Qcache_not_cached:没有被 Cache 的 SQL 数,包括无法被 Cache 的 SQL 以及由于 query_cache_type 设置的不会被 Cache 的 SQL

Qcache_queries_in_cache:目前在 Query Cache 中的 SQL 数量

Qcache_total_blocks:Query Cache 中总的 Block 数量

 

内存碎片的产生。当一块分配的内存没有完全使用时,MySQL会把这块内存Trim掉,把没有使用的那部分归还以重 复利用。比如,第一次分配4KB,只用了3KB,剩1KB,第二次连续操作,分配4KB,用了2KB,剩2KB,这两次连续操作共剩下的 1KB+2KB=3KB,不足以做个一个内存单元分配, 这时候,内存碎片便产生了。使用flush query cache,可以消除碎片

 

下面是命中率和内存使用率的一些算法

      query_cache_min_res_unit的估计值:(query_cache_size - Qcache_free_memory) / Qcache_queries_in_cache

      查询缓存命中率 ≈ (Qcache_hits – Qcache_inserts) / Qcache_hits * 100%

      查询缓存内存使用率 ≈ (query_cache_size – Qcache_free_memory) / query_cache_size * 100%

 

InnoDB存储引擎的缓冲池

     通常InnoDB存储引擎缓冲池的命中不应该小于99%,如:

mysql> show global status like 'innodb%read%'\G           
*************************** 1. row ***************************
Variable_name: Innodb_buffer_pool_read_ahead_rnd
        Value: 0
*************************** 2. row ***************************
Variable_name: Innodb_buffer_pool_read_ahead
        Value: 0
*************************** 3. row ***************************
Variable_name: Innodb_buffer_pool_read_ahead_evicted
        Value: 0
*************************** 4. row ***************************
Variable_name: Innodb_buffer_pool_read_requests
        Value: 81337
*************************** 5. row ***************************
Variable_name: Innodb_buffer_pool_reads
        Value: 432
*************************** 6. row ***************************
Variable_name: Innodb_data_pending_reads
        Value: 0
*************************** 7. row ***************************
Variable_name: Innodb_data_read
        Value: 9261056
*************************** 8. row ***************************
Variable_name: Innodb_data_reads
        Value: 450
*************************** 9. row ***************************
Variable_name: Innodb_pages_read
        Value: 431
*************************** 10. row ***************************
Variable_name: Innodb_rows_read
        Value: 290
10 rows in set (0.15 sec)

参数说明:
Innodb_buffer_pool_reads: 表示从物理磁盘读取页的次数

Innodb_buffer_pool_read_ahead: 预读的次数

Innodb_buffer_pool_read_ahead_evicted: 预读的页,但是没有读取就从缓冲池中被替换的页的数量,一般用来判断预读的效率

Innodb_buffer_pool_read_requests: 从缓冲池中读取页的次数

Innodb_data_read: 总共读入的字节数

Innodb_data_reads: 发起读取请求的次数,每次读取可能需要读取多个页

 

Innodb缓冲池命中率计算:

从上面信息可以求得:

mysql> select 81337/(81337+0+432);
+---------------------+
| 81337/(81337+0+432) |
+---------------------+
|              0.9947 |
+---------------------+
1 row in set (0.00 sec)

 

转载于:https://www.cnblogs.com/xuanzhi201111/p/4036931.html


http://www.niftyadmin.cn/n/1123772.html

相关文章

最简单方法搞定 VirtualBox 虚拟机共享文件问题

太阳先人出品的VirtualBox还算将就,不要钱,不要序列号,不用编译(直接rpm搞定)。还是中文的,已经算不错老,最起码能解决LINUX下面用XP软件的90%问题,和谐和谐两个系统麻&a…

Apache实现反向代理负载均衡

说到负载均衡LVS这套技术,有很多种实现方法。 本文所说,主要就是利用apache服务器实现反向代理,实现负载均衡。 首先,传统的正向代理如下图所示,正如我们用的游戏加速代理,大多的个人PC把请求发给正向代理服…

同济大学高等数学上册电子版_同济大学编高等数学上册第十一页例题几何解法...

这道题是描述这样一个规律:定义域对称的函数f(x),总是能被分解为偶函数g(x)与奇函数h(x)之和。书中使用代数解,很清晰简洁。f(x)f(-x) 肯定是 偶函数,f(x)-f(-x)肯定是奇函数。所以 这个偶函数这个奇函数2f(x);也就能拼出f(x)了(奇偶函数各/2…

获取rpm文件,不安装

2019独角兽企业重金招聘Python工程师标准>>> 比如你要将test.rpm用test.rpm里的某个文件,但你又不想安装test.rpm,那你可以试试这个办法。 随便建一个目录 mkdir aaa 把test.rpm放入目录aaa里并进入aaa目录 cp path/to/test.rpm aaa/ cd aaa …

在Oracle中使用rank()over()排名的问题

排序: ---rank()over(order by 列名 排序)的结果是不连续的,如果有4个人,其中有3个是并列第1名,那么最后的排序结果结果如:1 1 1 4 select scoreid, studentid,COURSENAME,totalexamscore , rank()over(order by TOTAL…

hadoop之mapreduce实例

例子很简单,我没有运行自带的wordcount,而是自己做了一个简单的例子。实现的功能是从我们的nginx的access log里面计算url访问的次数。access log文件:10.2.112.22 - - [11/Apr/2012:10:25:31 0800] "GET /bf5bd91c/css/base/base_jiexi…

fib函数用迭代替换递归

fib函数递归实现&#xff1a; long Fib(long n) {if (n < 1) {return n; }else {var t1 Fib(n - 1);var t2 Fib(n - 2);return t1 t2; } } fib函数改为迭代&#xff1a; class Class1 {class Node …

Java四种线程池

线程池的好处 1、线程的创建需要消耗的&#xff0c;用完了马上就扔了比较可惜&#xff0c;所以把它缓存起来&#xff0c;以后还能再用&#xff1b; 2、可以根据实际情况调整线程池的大小&#xff0c;防止线程太多&#xff1b; 3、有些场合可以用线程池来做同步&#xff08;比如…