MySQL优化之应用端优化:MySQL查询高速缓冲_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2177 | 回复: 0   主题: MySQL优化之应用端优化:MySQL查询高速缓冲        下一篇 
yanghui
注册用户
等级:上尉
经验:584
发帖:92
精华:0
注册:2011-12-13
状态:离线
发送短消息息给yanghui 加好友    发送短消息息给yanghui 发消息
发表于: IP:您无权察看 2015-1-7 15:54:01 | [全部帖] [楼主帖] 楼主

     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值。

    查询高速缓冲配置

    通过have_query_cache服务器系统变量指示查询缓存是否可用: mysql> SHOW VARIABLES LIKE 'have_query_cache';      +------------------+-------+| Variable_name | Value | have_query_cache | YES |

+------------------+-------+ 即使禁用查询缓存,当使用标准 MySQL二进制时,这个值总是YES。


    其它几个系统变量控制查询缓存操作。当启动mysqld时,这些变量可以在选项文件或者命令行中设置。所有查询缓存系统变量名以query_cache_ 开头。

    为了设置查询缓存大小,设置query_cache_size系统变量。设置为0表示禁用查询缓存。 默认缓存大小设置为0;也就是禁用查询缓存。当设置query_cache_size变量为非零值时,应记住查询缓存至少大约需要40KB来分配其数据结构。(具体大小取决于系统结构) mysql> SET GLOBAL query_cache_size = 1000000; Query OK, 0 rows affected, 1 warning (0.00 sec)

    如果查询缓存大小设置为大于0,query_cache_type变量影响其工作方式。这个变量可以设置为下面的值: 0或OFF将阻止缓存或查询缓存结果. 1或ON将允许缓存,以SELECT SQL_NO_CACHE开始的查询语句除外。 2或DEMAND,仅对以SELECT SQL_CACHE开始的那些查询语句启用缓存。

    查询高速缓冲状态和维护

    可以使用FLUSH QUERY CACHE语句来清理查询缓存碎片以提高内存使用性能。该语句不从缓存中移出任何查询。 RESET QUERY CACHE语句从查询缓存中移出所有查询。FLUSH TABLES语句也执行同样的工作。

    为了监视查询缓存性能,使用SHOW STATUS查看缓存状态变量:

--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论