查询缓存会存储select查询的文本以及发送给客户端的相应结果。如果随后收到一个相同的查询,服务器从查询缓存中重新得到查询结果
mysql查询高速缓冲
查询缓存会存储select查询的文本以及发送给客户端的相应结果。如果随后收到一个相同的查询,服务器从查询缓存中重新得到查询结果,而不再需要解析和执行查询。如果有一个不经常改变的表并且服务器收到该表的大量相同查询,查询缓存在这样的应用环境中十分有用。
对于许多web服务器来说存在这种典型情况,它根据数据库内容生成大量的动态页面。查询缓存不返回旧的数据。当表更改后,查询缓存值的相关条目被清空。如果有许多mysqld服务器更新相同的myisam表,在这种情况下查询缓存不起作用。
查询缓存不适用于服务器方编写的语句。如果正在使用服务器方编写的语句,要考虑到这些语句将不会应用查询缓存。
服务器启动时要禁用查询缓存,设置query_cache_size系统变量为0。禁用查询缓存代码后,没有明显的速度提高。编译mysql时,通过在configure中使用--without-query-cache选项,可以从服务器中彻底去除查询缓存能力。
查询高速缓冲如何工作
查询解析之前进行比较,因此下面的两个查询被查询缓存认为是不相同的:
select * from tbl_name
select * from tbl_name
查询必须是完全相同的(逐字节相同)才能够被认为是相同的。
另外,同样的查询字符串由于其它原因可能认为是不同的。使用不同的数据库、不同的协议版本或者不同 默认字符集的查询被认为是不同的查询并且分别进行缓存。
从查询缓存中提取一个查询之前,mysql检查用户对所有相关数据库和表的select权限。如果没有权限,不使用缓存结果。如果从查询缓存中返回一个查询结果,服务器把qcache_hits状态变量的值加一,而不是com_select变量。
如果一个表被更改了,那么使用那个表的所有缓冲查询将不再有效,并且从缓冲区中移出。这包括那些映射到改变了的表的使用merge表的查询。一个表可以被许多类型的语句更改,例如insert、update、delete、truncate、alter table、drop table或drop database。commit执行完后,被更改的事务innodb表不再有效。使用innodb表时,查询缓存也在事务中工作,使用该表的版本号来检测其内容是否仍旧是当前的。
视图产生的查询被缓存。select sql_calc_found_rows ...和select found_rows() type类型的查询使用查询缓存。即使因创建的行数也被保存在缓冲区内,前面的查询从缓存中提取,found_rows()也返回正确的值。
如果一个查询包含下面函数中的任何一个,,它不会被缓存:
benchmark()
connection_id()
curdate()
current_date()
current_time()
current_timestamp()
curtime()
database()
带一个参数的encrypt()
found_rows()
get_lock()
last_insert_id()
load_file()
master_pos_wait()
now()
rand()
release_lock()
sysdate()
不带参数的unix_timestamp()
user()
在下面的这些条件下,查询也不会被缓存:
引用自定义函数(udfs)。
引用自定义变量。
引用mysql系统数据库中的表。
下面方式中的任何一种:
select ...in share mode
select ...for update
select ...into outfile ...
select ...into dumpfile ...
select * from ...where autoincrement_col is null
最后一种方式不能被缓存是因为它被用作为odbc工作区来获取最近插入的id值。
