MySQL缓存的详细入门以及简单教程

从 MySQL 4.0.1 开始,MySQL有一个重要的特征:Query Cache。 当在使用中,查询缓存会存储一个 SELECT 查询的文本与被传送到客户端的相应结果。如果之后接收到一个同样的查询,服务器将从查询缓存中检索结果,而不是再次分析和执行这个同样的查询。

注意:查询缓存绝不返回过期数据。当数据被修改后,在查询缓存中的任何相关词条均被转储清除。

在某些表并不经常更改,而你又对它执行大量的相同查询时,查询缓存将是非常有用的。


上面简单说了一下mysql缓存,下面开始说到mysql缓存设置的一些相关资料。

1.首先命令行界面,输入以下代码,查看一些mysql缓存的基本设置:

show variables like '%query_cache%';

以下这是2个mysql出现的2种状态:

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             | 16777216 |
| query_cache_type             | ON       |
| query_cache_wlock_invalidate | OFF      |
+------------------------------+----------+
6 rows in set
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             | 0       |
| query_cache_type             | ON      |
| query_cache_wlock_invalidate | OFF     |
+------------------------------+---------+
6 rows in set

会发现其变量have_query_cache的值多是yes,MYSQL初学者很容易以为这个参数为YES就代表开启了查询缓存,实际上是不对的,该参数表示当前版本的MYSQL是否支持Query Cache。

query_cache_limit 可缓存的Select查询结果的最大值 1048576 byte /1024 = 1024kB 即最大可缓存的select查询结果必须小于1024KB。

query_cache_min_res_unit 每次给query cache结果分配内存的大小 默认是 4096 byte 也即 4kB。这个值设置越大碎片越多,设置越小IO负担增大,看你自己如何取舍,一般默认值就可以了。

query_cache_size ,是系统分配的缓存大小,该值为0,表示禁用query cache。所以说第一种情况下是开启了query cache,第2种情况是关闭了query cache。

query_cache_wlock_invalidate表写锁时,无法读取缓存。


如何设置query_cache_size呢?

大概在mysql文件夹内的my.ini第94~105行:

# Query cache is used to cache SELECT results and later return them
# without actual executing the same query once again. Having the query
# cache enabled may result in significant speed improvements, if your
# have a lot of identical queries and rarely changing tables. See the
# "Qcache_lowmem_prunes" status variable to check if the current value
# is high enough for your load.
# Note: In case your tables change very often or if your queries are
# textually different every time, the query cache may result in a
# slowdown instead of a performance improvement.
query_cache_size=25M

PS:当然你也可以增加一行query_cache_type,这个是用来控制缓存的类型的。这个值不能随便设置,必须设置为数字01,2

0:OFF,不缓存或重新得到结果。

1:ON,缓存所有结果,除了SELECT SQL_NO_CACHE……查询。(默认值)

2:DEMAND,仅缓存SELECT SQL_CACHE……查询


2.显示缓存当前的状态。

show status like 'qcache%';

输入上述命令显示状态如下:

mysql> show status like 'qcache%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| Qcache_free_blocks      | 1100      |
| Qcache_free_memory      | 3030696   |
| Qcache_hits             | 419577536 |
| Qcache_inserts          | 243192497 |
| Qcache_lowmem_prunes    | 176818239 |
| Qcache_not_cached       | 9334584   |
| Qcache_queries_in_cache | 2817      |
| Qcache_total_blocks     | 8142      |
+-------------------------+-----------+
8 rows in set


Qcache_free_blocks:表示查询缓存中目前还有多少剩余的blocks。如果该值显示较大,则说明查询缓存中的内存碎片过多了,可能在一定的时间进行整理。


Qcache_free_memory:表示查询缓存区现在还有多少的可用内存。

Qcache_hits:表示查询缓存区的命中个数,也就是直接从查询缓存区作出响应处理的查询个数。数值越大说明缓存的效果越理想。

Qcache_inserts:表示查询缓存区此前总过缓存过多少条查询命令的结果。次数越多表示在执行新来的SQL请求在缓存中未找到不得不执行查询处理,执行查询处理后把结果insert到查询缓存中。次数越多缓存效果也就不理想。(系统刚启动的时候,这个数值会比较大,毕竟查询缓存是空的)

Qcache_lowmem_prunes:表示查询缓存区已满而从其中溢出和删除的查询结果的个数。根据可以适当的调准缓存的大小。

Qcache_not_cached:表示没有进入查询缓存区的查询命令个数。

Qcache_queries_in_cache:查询缓存区当前缓存着多少条查询命令的结果。

Qcache_total_blocks:当前缓存的block数量。


以上面我博客的mysql为例。

查询缓存碎片率 = Qcache_free_blocks / Qcache_total_blocks * 100%

查询缓存碎片率 = 1100/8142*100% ≈ 13.51%

如果查询缓存碎片率超过20%,可以用FLUSH QUERY CACHE整理缓存碎片,或者试试减小query_cache_min_res_unit,如果你的查询都是小数据量的话。


查询缓存利用率 = (query_cache_size - Qcache_free_memory) / query_cache_size * 100%

查询缓存利用率 = (16777216-3030696)/16777216*100% ≈ 81.94%

查询缓存利用率在25%以下的话说明query_cache_size设置的过大,可适当减小;查询缓存利用率在80%以上而且Qcache_lowmem_prunes > 50的话说明query_cache_size可能有点小,要不就是碎片太多。


查询缓存命中率 = (Qcache_hits - Qcache_inserts) / Qcache_hits * 100%

查询缓存命中率 = (419577536-243192497)/419577536*100% ≈42.04%

查询缓存命中率42.04%

  • 下载列表

目前有 0 条评论

昵称
邮箱
主页
提交
订阅