自己是mysql初学者。学了很多之后,发现自己总是在重复看一些东西,具体说的时候又说不上来。所以决定整理一下,权当回顾。

错误或疏漏的地方,请大家指正,共同学习。谢谢!

 

MySQL数据库中缓存的管理技巧:MySQL数据库缓存是怎么回事,怎么提高缓存命中率。

  一、什么时候应用系统会从缓存中获取数据?

   简单的说,缓存就是一个查找表(lookup table);数据缓存就是内存中的一块存储区域,其存储了用户的SQL文本以及相关的查询结果。

通常情况下,用户下次查询时,如果所使用的SQL文本是相同的,并且自从上次查询后,相关的表记录没有被更新(插入数据)过,此时数据库就直接采用缓存中的内容。从这个原则中,可以看到如果要直接使用缓存中的数据,至少要满足以下几个条件:

a)   所采用的SQL文本必须相同。这里需要注意的是,这里的SQL文本必须一字不差的完全相同。当前后两次用户使用了相同的SQL语句(假设不考虑其他条件),则服务器会从缓存中读取结果。只要字段不同、where子句不同,即使最后的查询结果是相同的,系统仍然是从数据文件中获取数据,而不是从数据缓存中。

b)   从数据缓存的角度考虑,大小写是不敏感的。如前后两次查询时,采用的字段名称可能只有大小写的差异。如第一次使用的是大小,第二次使用的是小写,这系统认为仍然是相同的SQL语句。或者说关键字大小写等等这都是不敏感的。 

c)   要保证查询前数据没有被更新过。即使你查询的这一列没有更新,但其他列更新过数据、或表插入一个新行,那么所有的缓存都已被清除,再次查询,将不会从缓存中读取。

d)   需要注意,默认字符集对缓存命中率的影响。通常情况下,如果客户端与服务器之间所采用的默认字符集不同,则即使查询语句相同、在两次查询之间记录与表结构也没有被更改,系统仍然认为是不同的查询。

  二、如何对查询缓存进行维护和优化。

1)   使用多个较小的表而不是一个大表

2)   成批的进行写入操作而不是逐个执行

3)   进行表分区。将频繁更新的表字段和基本不变动的表字段分开。对于写任务频繁的程序,关闭查询缓存可能会改进性能。

4)   减少碎片。明显碎片多会浪费内存。可以通过Qcache_free_blocks的值来显示缓存中有多少内存块处于free情况。如果Qcache_free_blocks大致等于Qcache_total_blocks/2,则碎片情况非常严重。

5)提高内存中缓存的配置,来提高命中率。当查询结果大于分配给查询语句的内存(query_cache_limit)时,查询不会被缓存。服务器在产生结果的同时进行缓存。如果结果太大,超过了限制,mysql会丢掉已经缓存的值,反而增加了开销。

三、缓存配置:

在my.cnf(Linux)或my.ini(Windows)中加入以下项目:

query_cache_size = 268435456  //分配256M内存给Query Cache;
query_cache_type = 1  // 0 代表不使用缓冲, 1 代表使用缓冲,2 代表根据需要使用。
query_cache_limit = 1048576 //指定个别的查询语句1MB的内存

这些数据可以根据自己的需求作出适当的更改,设置完成之后,保存文档,重新启动MySQL即可。

配置还不是很清楚,有待学习。还有,此篇是针对查询缓存,还有写缓存没整理。