`

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

 
阅读更多

转:http://tech.it168.com/a2011/0421/1181/000001181306.shtml

 

 【IT168 技术】在数据库中,用户可能多次执行相同的查询语句。为了提高查询效率,数据库会在内存在划分一个专门的区域,用来存放用户最近执行的查询,这块区域就是缓存。因为内存的运行速度要比硬盘快的多。为此通过缓存机制,就可以提高查询的效率。当用户下一次再执行相同查询时,就可以直接从缓存中获取数据,而不用到硬盘中的数据文件中去读取数据,也可以省去相关解析的工作。

  一、数据缓存的应用环境

  并不是在任何情况下数据缓存都能够起到应有的效果。如果企业有一个不经常改变的表并且服务器受到这个表的大量的相同查询时,数据缓存才能够起到不错的效果。通常情况下,针对Web的应用,效果会比较明显。如现在在数据库中有一张产品信息表。企业的用户需要通过网页来查询产品的信息。如果在系统设计时,默认查询的结果是显示最近一个月交易过的产品信息。那么每次用户按默认情况查询产品信息时,将都会从缓存中获取信息(如果相关的信息没有被更新过)。此时系统查询的速度就会比较快。

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

  如果企业有一个不经常改变的表并且服务器受到这个表的大量的相同查询时,笔者就建议大家启用数据缓存机制。在启动之前,可以先使用命名(如上图所示)来查询现在系统缓存是否开启。如上图所示,如果查询的结果是YES的话,那么就说明系统中已经开启了数据缓存机制。

  二、数据缓存使用的限制

  并不是在任何情况下,数据缓存都会起到改善查询的效果。根据笔者的项目经验,认为在一下几种情况,数据缓存机制的效果并不会很大。

  一是查询所涉及到的表会经常更改。如在一个进销存管理系统中,可能会有产品与销售记录两张表格。产品表一般不怎么会更新,而销售记录表就可能每分钟都会发生变化。此时对于销售记录表来说,采用缓存机制就不会起到多大的效果。因为根据缓存的工作原理,当某个表被更改后,其对应的数据缓存的相关条目就会被清空。

  二是查询缓存不使用与服务器方便些的语句。根据B/S或者C/S架构,可以将相关应用分为服务器断和客户端两类。在使用数据缓存时,数据库管理员要考虑到,在MySQL数据库中,查询缓存并不适用于服务器方所编写的查询语句。当数据库管理员正在使用服务器方编写的语句时,要注意到这些语句并不会应用缓存技术。

  三是查询时使用缓存的两个基本条件:所采用的查询语句完全一样以及相关数据表妹欧发生更改。对于后面一条,上面已经谈到过。这里笔者要说的是,什么叫做查询语句瓦圈一样?简单的说,就是前后使用的两条查询语句(不一定要连在一起)完全一致。不仅包括查询的字段,也包括查询的条件。在这里要认识到一个误区。如果在5分钟之前用户查询一个产品信息表,其没有用到任何查询条件,查询全部的产品信息记录。5分钟之后又有一个用户查询产品信息表,此时其使用了查询条件,如只查询最近一个月新建的产品信息。显然此时后面一个查询的结果是前面一个查询结果的子集(不考虑产品基本表在这个时间间隔中是否做了更改)。照理来说应该可以使用数据缓存。但是这里需要注意,此时前后两条查询语句,其是不相同的(其查询条件不同)。即使结果是相同的,或者具有包含关系,数据库仍然会先重新解析SQL语句,然后从硬盘上的数据文件中去获取数据。

  另外需要注意的是如果用户在查询语句中,使用了自定义函数、自定义变量或者因引用了系统数据库中的表,那么缓存机制也会失效。

  三、提高缓存的使用效果

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

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

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

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

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

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

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

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

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

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

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

分享到:
评论

相关推荐

    MySQL数据库原理及设计方法.pdf

    MySQL数据库是一种广泛使用的开源关系型数据库管理系统,其原理和设计方法是数据库管理员和开发者必须掌握的基础知识。本文将深入探讨MySQL的逻辑架构、并发控制、事务处理等方面。 首先,MySQL的逻辑架构分为三层...

    MySQL数据库原理及应用(第2版)(微课版)-教学用数据库(Mysql数据库备份文件).zip

    MySQL数据库是世界上最受欢迎的开源关系型数据库管理系统之一,其设计理念在于提供快速、可靠的数据存储解决方案。在《MySQL数据库原理及应用(第2版)(微课版)》中,我们通常会深入探讨数据库的基本概念、设计...

    mysql数据库基础.pdf

    MySQL数据库是世界上最流行的开源关系型数据库管理系统之一,其工作流程涉及多个步骤,这些步骤在处理SQL语句时至关重要。以下是对这些步骤的详细说明: 首先,客户端通过连接器与MySQL服务器建立连接。连接器负责...

    MYSQL数据库在科研管理系统中的应用.pdf

    MySQL数据库在科研管理系统中的应用广泛,它作为关系型数据库,为科研管理提供了高效的数据存储和检索能力。科研管理系统通常涉及到大量的数据,如项目信息、经费报销、科研成果、人员资料等,MySQL数据库凭借其强大...

    mysql数据库英文文献.doc

    MySQL数据库的架构与历史紧密相关,因此在理解MySQL时,我们不得不回顾它的起源和发展历程。MySQL的历史可以追溯到1979年,当时Monty Widenius在一家名为TcX的小公司工作,他创建了一个用BASIC语言编写的报表工具,...

    MySQL 5.1 版数据库

    MySQL 5.1是MySQL数据库管理系统的一个重要版本,它在2005年发布,以其稳定性和高效性受到广泛欢迎。MySQL是一个开源的关系型数据库管理系统(RDBMS),由瑞典的MySQL AB公司开发,后来被Sun Microsystems收购,最终...

    Ajax Jsp 连接MySQL数据库

    在这个“Ajax Jsp 连接MySQL数据库”的主题中,我们将深入探讨如何在JSP页面上利用Ajax技术与后台MySQL数据库进行交互,同时处理多个Ajax请求。 首先,让我们了解基本概念。Ajax的核心是通过JavaScript向服务器发送...

    android连接mysql数据库例子

    在Android应用开发中,连接MySQL数据库是常见的需求,特别是在构建需要后台数据支持的应用时。这里我们将探讨如何在Android客户端通过网络连接到远程MySQL服务器,并执行相关的数据库操作。 首先,理解客户端-...

    MySQL数据库的常见面试题解析,建议收藏!(附答案)

    对于软件测试工程师而言,深入理解MySQL数据库是面试中不可或缺的一部分。以下是一些关于MySQL的常见面试题及其解析: 1. **MySQL简介**:MySQL是一个开源的、基于SQL标准的关系型数据库管理系统,它允许用户通过...

    基于MySQL数据库的查询性能优化研究.pdf

    MySQL 数据库是当前网络环境中最流行的开源关系型数据库之一,随着网络环境中数据总量的急剧攀升,对数据库查询的响应时间提出了更严格的要求。为了提高查询效率,需要研究 MySQL 数据库的查询性能优化。 本文主要...

    MySql 数据库入门视频学习

    在本篇内容中,我们将基于提供的“MySQL数据库入门视频学习”的相关信息进行展开,详细解析与MySQL数据库相关的基础知识、核心概念及实用技巧。 ### MySQL数据库简介 MySQL是一种广泛使用的开源关系型数据库管理...

    MySQL数据库的常见面试题解析,建议收藏!(附答案).zip

    MySQL数据库是全球最受欢迎的关系型数据库管理系统之一,广泛应用于各种规模的企业和项目中。这份文档集包含了一些MySQL数据库在面试中常见的问题及其解答,是准备面试或深入理解MySQL知识的宝贵资源。以下是一些...

    MySQL数据库性能监控与诊断

    ### MySQL数据库性能监控与诊断详解 在IT领域,特别是对于依赖于数据库的现代应用程序而言,数据库性能监控与诊断是确保系统稳定性和响应速度的关键环节。本文将深入探讨MySQL数据库性能监控与诊断的相关知识点,...

    MySQL 数据库架构全掌握

    MySQL数据库架构主要包括以下几个核心组件: 1. **客户端/服务器架构**: - **客户端**:通过多种编程语言接口连接MySQL服务器。 - **服务器**:处理客户端请求、执行查询、返回结果并管理数据存储。 2. **SQL层...

    接收NetFlow数据并导入Mysql数据库的Java工具

    标题中的“接收NetFlow数据并导入Mysql数据库的Java工具”指的是一个利用Java编程语言开发的应用,该应用能够处理从网络设备上收集的NetFlow数据,并将这些数据存储到MySQL数据库中。NetFlow是一种网络流量监测协议...

    MySQL数据库:MySQL数据库基础架构与历史

    ### MySQL数据库:MySQL数据库基础架构与历史 #### 一、MySQL的历史与发展 ##### 1. MySQL的起源 MySQL是一款由瑞典MySQL AB公司开发的关系型数据库管理系统。它的故事始于1979年的瑞典森林中,创始人Michael ...

    MySQL数据库的多线程引擎的实现思路.pdf

    MySQL数据库在大数据时代中扮演着至关重要的角色,其性能直接影响着应用程序的运行效率。多线程引擎的实现是提升MySQL数据库性能的关键,特别是在处理大量并发请求时。本文将探讨MySQL数据库多线程引擎的实现思路...

    MySQL 数据库设计实践

    ### MySQL 数据库设计实践 ...通过对MySQL数据库的设计实践进行深入探讨,我们可以更好地理解如何构建高效、稳定且易于维护的数据库系统。这不仅有助于提高数据处理能力,还能为用户提供更好的服务体验。

    mysql数据库5.5

    MySQL数据库5.5版是MySQL关系型数据库管理系统的一个重要里程碑,它在5.x系列中提供了许多增强的功能和优化,旨在提高性能、可扩展性和安全性。MySQL是一个开源、免费的数据库解决方案,广泛应用于Web应用程序、数据...

Global site tag (gtag.js) - Google Analytics