6.9 mysql 查询缓存
从 mysql 4.0.1 开始,mysql server 有一个重要的特征:query cache。 当在使用中,查询缓存会存储一个 select 查询的文本与被传送到客户端的相应结果。如果之后接收到一个同样的查询,服务器将从查询缓存中检索结果,而不是再次分析和执行这个同样的查询。
注意:查询缓存绝不返回过期数据。当数据被修改后,在查询缓存中的任何相关词条均被转储清除。
在某些表并不经常更改,而你又对它执行大量的相同查询时,查询缓存将是非常有用的。对于许多 web 服务器使用大量的动态信息,这是一个很典型的情况。
下面是查询缓存的一个性能数据。(这些结果的产生,是通过在一个 a linux alpha 2 x 500 mhz、2gb ram 和 64mb 查询缓存上执行 mysql 基准套件和到的):
* 如果你执行的所有查询均是简单的(比如从表中一行一行的选取);但是仍然是不同的,所以该查询不能被缓冲,查询缓存处于活动时,开销为 13%。这可以被看作是最差的情况。然而,在实际情况下,查询是比我们的简单示例要复杂得多的,所以开销通常显著得低。
* 在只有一行记录表中搜索一行后,搜索将快 238% 。这可以被认为是接近于对一个被缓冲的查询所期望的最小的加速。
* 如果你希望禁用查询缓存,设置 query_cache_size=0。禁用了查询缓存,将没有明显的开销。(在配置选项 --without-query-cache 的帮助下,查询缓存可以被排除在外码之外)
6.9.1 查询缓存如何运作
查询在分析之前先被比较,因而
select * from tbl_name
和
select * from tbl_name
对于查询缓存被当作是不同的查询,因而查询需要严格的一致(字节对字节的),才会被认为是同样的。 另外,如果一个客户端使用一个新的连接协议格式或不同于其它客户端的另一个字符集,一个查询将被视为不同的。
使用不同数据库的,使用不同协议版本的,或使用不同的缺省字符串的查询将被认为是不同的查询,并将分别的缓冲。
高速缓冲不对 select calc_rows ... 和 select found_rows() ... 类型的查询起作用,因为找到的行的数目也是被存储在缓冲里的。
如果查询结果被从查询缓存中返回,那么状态变量 com_select 将不会被增加,但是 qcache_hits 却会增加。查看章节 6.9.4 查询缓存的状态和维护。
如果一个表发生的改变 (insert, update, delete, truncate, alter 或 drop tabledatabase),那么所有这张表使用的缓冲的查询(可能通过一个 mrg_myisam 表!)将被得失效,并从缓冲中移除。
innodb 表的事务所做的更改将在一个 commit 被完成时,使数据失效。
如果一个查询包括下面的函数,它将不能被缓冲:
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器