|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
即使对于MySQL的商业化的企业版来说,也没有高昂的许可证成本,当你将其与像甲骨文和微软之类的大型专有商业数据库比较的话。mysql|参考|参考手册|缓存|中文MySQL4.1.0中文参考手册---犬犬(心帆)翻译MySQLReferenceManualforversion4.1.0-alpha.
6.9MySQL查询缓存
从MySQL4.0.1入手下手,MySQLserver有一个主要的特性:QueryCache。当在利用中,查询缓存会存储一个SELECT查询的文本与被传送到客户真个响应了局。假如以后吸收到一个一样的查询,服务器将从查询缓存中检索了局,而不是再次剖析和实行这个一样的查询。
注重:查询缓存毫不前往过时数据。当数据被修正后,在查询缓存中的任何相干词条均被转储扫除。
在某些表其实不常常变动,而你又对它实行大批的不异查询时,查询缓存将长短常有效的。关于很多WEB服务器利用大批的静态信息,这是一个很典范的情形。
上面是查询缓存的一本性能数据。(这些了局的发生,是经由过程在一个aLinuxAlpha2x500MHz、2GBRAM和64MB查询缓存上实行MySQL基准套件和到的):
假如你实行的一切查询均是复杂的(好比从表中一行一行的拔取);可是仍旧是分歧的,以是该查询不克不及被缓冲,查询缓存处于举动时,开支为13%。这能够被看做是最差的情形。但是,在实践情形下,查询是比我们的复杂示例要庞大很多的,以是开支一般明显得低。在只要一行纪录表中搜刮一行后,搜刮将快238%。这能够被以为是靠近于对一个被缓冲的查询所希冀的最小的减速。假如你但愿禁用查询缓存,设置query_cache_size=0。禁用了查询缓存,将没有分明的开支。(在设置选项--without-query-cache的匡助下,查询缓存能够被扫除在外码以外)6.9.1查询缓存怎样运作
查询在剖析之前先被对照,因此
SELECT*FROMtbl_name
和
Select*fromtbl_name
关于查询缓存被看成是分歧的查询,因此查询必要严厉的分歧(字节对字节的),才会被以为是一样的。别的,假如一个客户端利用一个新的毗连协定格局或分歧于别的客户真个另外一个字符集,一个查询将被视为分歧的。
利用分歧数据库的,利用分歧协定版本的,或利用分歧的缺省字符串的查询将被以为是分歧的查询,并将分离的缓冲。
高速缓冲不合错误SELECTCALC_ROWS...和SELECTFOUND_ROWS()...范例的查询起感化,由于找到的行的数量也是被存储在缓冲里的。
假如查询了局被从查询缓存中前往,那末形态变量Com_select将不会被增添,可是Qcache_hits却会增添。检察章节6.9.4查询缓存的形态和保护。
假如一个表产生的改动(INSERT,UPDATE,DELETE,TRUNCATE,ALTER或DROPTABLE|DATABASE),那末一切这张表利用的缓冲的查询(大概经由过程一个MRG_MyISAM表!)将被得生效,并从缓冲中移除。
InnoDB表的事件所做的变动将在一个COMMIT被完成时,使数据生效。
假如一个查询包含上面的函数,它将不克不及被缓冲:函数函数函数User-DefinedFunctionsCONNECTION_IDFOUND_ROWSGET_LOCKRELEASE_LOCKLOAD_FILEMASTER_POS_WAITNOWSYSDATECURRENT_TIMESTAMPCURDATECURRENT_DATECURTIMECURRENT_TIMEDATABASEENCRYPT(只要一个参数挪用)LAST_INSERT_IDRANDUNIX_TIMESTAMP(无参数挪用)USERBENCHMARK
假如一个查询包括用户变量,援用MySQL体系数据库,或以下之一的格局,SELECT...INSHAREMODE,SELECT...INTOOUTFILE...,SELECT...INTODUMPFILE...或SELECT*FROMAUTOINCREMENT_FIELDISNULL(检索最初一个拔出ID-ODBC语句),该查询亦不成以被缓存。
但是,FOUNDROWS()将前往准确的值,即便先前的查询是从缓存中读取的。
万逐一个查询不利用任何表,或利用一时表,或用户对任何相干表有一个列权限,那末查询将不会被缓存。
在一个查询从查询缓存中读取前,MySQL将反省用户对一切相干的数据库和表有SELECT权限。假如不是这类情形,缓存的了局将不克不及被利用。
6.9.2查询缓存设置
查询缓存为了mysqld增加了几个MySQL体系变量,它能够在设置文件中被设置,或在启动mysqld时的命令行上设置。
query_cache_limit不缓存年夜于这个值的了局。(缺省为1M)
query_cache_min_res_unit这个变量从4.1被引进。查询的了局(已被传送到客户真个数据)在了局检索时代被存储到查询缓存中。因此,数据不会以一个年夜块地处置。查询缓存在必要时分派块用于处置这个数据,以是当一个块被添补后,一个新的块被分派。甚为内存分派操纵是高贵的,查询缓存以最小的尺寸query_cache_min_res_unit分派块。当一个查询实行完成,最初的了局块被修整到实践数据的尺寸巨细,以便未利用的内存被开释。query_cache_min_res_unit的缺省值为4KB,在年夜多半据情形下已够用了。假如你有很多查询前往一个较小的了局,缺省的块尺寸大概会引发内存碎片(显现为一个很年夜数目的余暇块(Qcache_free_blocks),这将引发查询缓存不能不因缺少内存(Qcache_lowmem_prunes)而从缓存中删除查询)。在这类情形下,你应当削减query_cache_min_res_unit。假如你的次要查询前往的是年夜的了局集(检察Qcache_total_blocks和Qcache_queries_in_cache),你能够经由过程增添query_cache_min_res_unit来增添功能。但是,要当心不要将它设得太年夜。
query_cache_size为了存储老的查询了局而分派的内存数目(以字节指定)。假如设置它为0,查询缓冲将被克制(缺省值为0)。query_cache_type这个能够被设置为(只能是数字)选项寄义0(OFF,不缓存或从头失掉了局)1(ON,缓存一切的了局,除SELECTSQL_NO_CACHE...查询)2(DEMAND,仅缓存SELECTSQL_CACHE...查询)
在一个线程(毗连)内,查询缓存的举动能够被改动。句法以下所示:
QUERY_CACHE_TYPE=OFF|ON|DEMANDQUERY_CACHE_TYPE=0|1|2
选项寄义0orOFF不缓存或从头失掉了局1orON缓存一切的了局,除SELECTSQL_NO_CACHE...查询2orDEMAND仅缓存SELECTSQL_CACHE...查询6.9.3在SELECT中的查询缓存选项
有两个大概的查询缓存相干的参数能够在一个SELECT查询中被指定:
选项寄义SQL_CACHE假如QUERY_CACHE_TYPE为DEMAND,同意该查询被缓存。假如QUERY_CACHE_TYPE为ON,这是缺省的。假如QUERY_CACHE_TYPE为OFF,它不做任何事SQL_NO_CACHE使这个查询不被缓存,不同意这个查询被存储到高速缓存中6.9.4查询缓存的形态和保护
利用FLUSHQUERYCACHE命令,你能够收拾查询缓存,以更好的使用它的内存。这个命令不会从缓存中移除任何查询。FLUSHTABLES会转储扫除查询缓存。
RESETQUERYCACHE任务从查询缓存中移除一切的查询了局。
你能够反省查询缓存在你的MySQL是不是被引进:
mysql>SHOWVARIABLESLIKEhave_query_cache;+------------------+-------+|Variable_name|Value|+------------------+-------+|have_query_cache|YES|+------------------+-------+1rowinset(0.00sec)
在SHOWSTATUS中,你能够监督查询缓存的功能:
变量寄义Qcache_queries_in_cache在缓存中已注册的查询数量Qcache_inserts被到场到缓存中的查询数量Qcache_hits缓存采样数数量Qcache_lowmem_prunes由于短少内存而被从缓存中删除的查询数量Qcache_not_cached没有被缓存的查询数量(不克不及被缓存的,或因为QUERY_CACHE_TYPE)Qcache_free_memory查询缓存的余暇内存总数Qcache_free_blocks查询缓存中的余暇内存块的数量Qcache_total_blocks查询缓存中的块的总数量
Totalnumberofqueries=Qcache_inserts+Qcache_hits+Qcache_not_cached.
查询缓存利用变长的块,因此Qcache_total_blocks和Qcache_free_blocks大概显现查询缓存的碎片。在FLUSHQUERYCACHE以后,只要残剩一个独自的(年夜的)余暇块。
注重:每一个查询最小必要两个块(一个用于存储查询文本,另外一个或多个用于存储查询了局)。一样的,每一个被一个查询利用的表必要一个块,可是,假如有两个或更多的查询利用统一张表,仅仅只必要分派一个块就好了。
你可使用形态变量Qcache_lowmem_prunes来谐查询拜访询缓存尺寸。它计数被从缓存中移除的查询,该查询的移除是为了开释内存,以缓存新建的查询。查询缓存利用一个leastrecentlyused(LRU)战略来判别从缓存中移除哪一个查询。
MySQL的双许可模式意味着,那些希望对数据库具有额外控制的人可以直接从数据库厂商那儿得到帮助。MySQLAB公司提供了支持和维护服务,诸如代码更新和补丁修补服务等,每年订阅费为大约3000美元。 |
|