MySQL数据库中缓存管理的思路解析

发表于:2012-1-11 10:08

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:水太深    来源:51Testing软件测试网采编

分享:

  三、提高缓存的使用效果

  通过数据库的合理设计,可以提高缓存的使用效果,扩大缓存的使用领域。具体的说,数据库管理员可以从如下几个方面出发。

  1、根据数据变化的频率来分解表

  如现在有产品基本资料与产品最新库存两部分内容。在不考虑缓存的情况下,可以将产品基本资料与产品库存放在同一个表中,然后通过其他作业来更新这个库存数量。如此的话,在前台界面中,就可以直观的反映出产品的库存数量。但是从缓存的设计角度来看,这么操作并不是很合理。因为产品信息相对来说不怎么会变化,而库存数量却经常在发生变化。如果将他们放在同一张表上,由于库存数量的不断更新,数据缓存中的内容就会不断被清空(与产品信息表相关的数据缓存)。此时如果很多用户要查询产品的描述、规格(他们可能并不关注产品的库存),那么他们就无法使用数据缓存。因为缓存中没有相关的数据(由于库存数量不断变化而被清空)。

  遇到这种情况时,数据库管理员就可以将库存数量与产品基本信息存放在两张不同的表上,然后通过关键字来进行关联。这么做的好处就是库存数量更新并不会影响到产品基本信息表所对应的数据缓存(他们是两张表)。从而提高产品信息查询时的缓存命中率。

  2、采用默认条件的查询来提高缓存命中率

  在上面的分析中笔者谈到,要两条完全相同的SQL语句才能够使用缓存。条件不同或者使用的字段不同,数据库系统都不会使用缓存来进行查询优化。另外MySQL数据库与其他数据库不一样,对于SQL语句解析来说,其大小写实敏感的。也就是说同一条查询语句,如果其关键字的大小写不同,那么也会被认为是用了不同的SQL语句。这一点是比较让人头疼的。针对这种情况,在客户端应用程序设计时,最好注意以下几点。

  一是要习惯采用默认条件的查询来提高缓存命中率。如在设计产品信息查询这个功能,可以考虑默认查询全部信息或者指定某个固定的条件。如此就可以提高缓存的命中率。而不要在不同的用户界面设置不同的默认值。某些应用系统,为了提高界面的友好性,会给用户提供一些个性化设置的参数,以保存用户的个性化内容。此时虽然可以提高界面的人性化,但是显然会降低数据缓存的命中率。遇到这种情况时,数据库管理员就需要在人性化设计与系统的查询性能之间进行均衡。

  不同的应用针对同一个表格的相同查询,其查询语句最好相同。如现在对于产品信息,即可以通过产品信息窗口进行查询,也可以根据报表来查询。此时其对应的后台表格是相同的。只要其执行的查询语句相同、并且在这段时间之内数据库表格没有发生变化,那么系统就可以从缓存中获取数据。在实际工作中,窗体与报表往往是有不同的人设计与开发的。如果现在这两个人SQL语句的书写习惯不同,一个人喜欢用大写,而另外一个人喜欢用小写。在系统中,对于SQL查询语句解析时区分大小写。如果大小写不同,则会被认为不同的SQL语句,此时系统也就无法使用缓存了。为此在遇到这种情况时,不同的用户之间要统一SQL语句的书写规范,如要么全部使用大写,要么全部使用小写。项目管理员要根据实际情况来制定相关的规则。

  3、提高缓存空间大小来提高数据库的缓存命中率

  当数据缓存满时,新的数据会覆盖旧的数据。如现在用户查询了一笔产品信息。1个小时后其在利用相同的语句查询了这个产品信息(假设在这个过程中产品信息表没有发生变化)。查询语句是否会采用缓存呢?答案是不一定。如果企业服务器的缓存空间足够的大,旧的缓存信息没有被新的查询内容所覆盖,那么就会采用缓存中的信息。相反,如果缓存比较小,此时系统旧的缓存信息就会被新的查询内容所覆盖掉。在这种情况下,即使查询的语句相同、表格也没有发生变化,数据库系统仍然要从硬盘上的数据文件中去获取数据。

  为此为了提高查询的效率,提高缓存的命中率,最好能够增加服务器上缓存的空间。现在内存价格比较便宜,这笔投资应该不会太大。特别是当在一台服务器上实现不同的应用时,提高内存的容量还是蛮有必要的。

  关于MySQL数据库中缓存管理的解析就为大家介绍这么多,希望大家都能够从中有所收获,以后如果在工作中遇到类似问题,就可以轻松解决了。

22/2<12
重磅发布,2022软件测试行业现状调查报告~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2023
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号