通过查询缓存提高MYSQL的查询性能
1.显然,这对于频繁更新的表,查询缓存是不适合的,而对于一些不常改变数据且有大量相同sql查询的表,查询缓存会节约很大的性能。(mysql4.0.1可以使用查询缓存)
2.查询缓存区分大小写 如:SELECT * from table1 与SELECT * FROM table1是不同的。
3.而且查询缓冲并不自动处理空格,因此,在写SQL语句时,应尽量减少空格的使用,尤其是在SQL首和尾的空格(因为,查询缓冲并不自动截取首尾空格)。如:SELECT * FROM table1 和 SELECT * FROM table1(带有空格)那么执行两条语句时,最后一条相同的SQL语句不会使用查询缓存。
4.虽然不设置查询缓冲,有时可能带来性能上的损失,但有一些SQL语句需要实时地查询数据,或者并不经常使用(可能一天就执行一两次)。这样就需要把 缓冲关了。当然,这可以通过设置query_cache_type的值来关闭查询缓冲,但这就将查询缓冲永久地关闭了。在MySQL 5.0中提供了一种可以临时关闭查询缓冲。
(1) SELECT SQL_NO_CACHE field1, field2 FROM TABLE1
以上的SQL语句由于使用了SQL_NO_CACHE,因此,不管这条SQL语句是否被执行过,服务器都不会在缓冲区中查找,每次都会执行它。
我们还可以将my.ini中的query_cache_type设成2,这样只有在使用了SQL_CACHE后,才使用查询缓冲。
(2) SELECT SQL_CALHE * FROM TABLE1
二、什么情况可以命中查询缓存?????
1.在检查缓存的时候,MySQL 不会对语句进行解析、正则化或者参数化,它精确地使用客户端传来的查询语句和其他数据(不同的数据库、不同的协议版本或者不同 默认字符集的查询,mysql也会认为这是不同的查询sql,会分别进行查询缓存)。只要字符大小写、空格或者注释有一点点不同,查询缓存就认为这是一个不同的查询.
2.查询缓存不会存储有不确定结果的查询。因此,任何一个包含不确定函数(比如NOW()或CURRENT_DATE())的查询不会被缓存。同样地,CURRENT_USER()或CONNECTION_ID()这些由不同用户执行,将会产生不同的结果的查询也不会被缓存。事实上,查询缓存不会缓存引用了用户自定义函数、存储函数、用户自定义变量、临时表、mysql 数据库中的表或者任何一个有列级权限的表的查询
3.查询必须是完全相同的(逐字节相同)才能够被认为是相同的。另外,同样的查询字符串由于其它原因可能认为是不同的。使用不同的数据库、不同的协议版本或者不同 默认字符集的查询被认为是不同的查询并且分别进行缓存。
三。查询缓存的性能消耗
1.读取查询在开始之前必须要检查缓存。
2.如果查询是可以被缓存的,但是不在缓存中,那么在产生结果进行保存会带来一些额外的开销。写入数据的查询也会有额外的开销,因为它必须使缓存中相关的数据表失效
show variables like '%query_cache%';(查看是否开启了缓存等参数)
FLUSH QUERY CACHE(会对缓存中的碎片进行整理,从而得到一个空闲块)
show status LIKE 'qcache%'(查询缓存的使用情况)