MySQL查询高速缓冲详解

查询高速缓冲概述

查询缓存存储SELECT查询的文本以及发送给客户端的相应结果。如果随后收到一个相同的查询,服务器从查询缓存中重新得到查询结果,而不再需要解析和执行查询。如果你有一个不经常改变的表并且服务器收到该表的大量相同查询,查询缓存在这样的应用环境中十分有用。对于许多Web服务器来说存在这种典型情况,它根据数据库内容生成大量的动态页面。

备注1.查询缓存不返回旧的数据。当表更改后(如INSERT、UPDATE、DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE操作),查询缓存值的相关条目被清空。2.如果你有许多mysqld服务器更新相同的MyISAM表,在这种情况下查询缓存不起作用。3.查询缓存不适用于服务器方编写的语句。如果正在使用服务器方编写的语句,要考虑到这些语句将不会应用查询缓存.

查询高速缓冲如何工作

当MySQL服务器收到一个查询请求的时候,MySQL服务器首先检查用户对所有相关数据库和表的SELECT权限,如权限通过,然后以该SQL文本作为key来从查询缓存中检索是否有相同的key(因为数据缓存都是以SQL文本作为key来保存的),如果从查询缓冲中找到对应的key值,就返回一个对应的查询结果,服务器把Qcache_hits状态变量的值加一,而不需要解析器对sql语句进行解析,如果查找不到对应的key值,然后执行sql的解析,然后查询,可以参考下图。

备注:

1.作为key值的sql语句是区分大小写的,即SELECT * FROM t1select * from t1对应的key值是不一样的。所以,如果开启了查询缓冲,在写SQL语句的时候,应注意这点。

2.如果一个表被更改了,那么使用那个表的所有缓冲查询将不再有效,并且从缓冲区中移出,这样保证了数据的一致性(即表中数据和缓冲中数据一致性)。

查询高速缓冲配置

1.查看查询缓冲是否可以

MySQL中,可以通过have_query_cache服务器系统变量指示查询缓存是否可用。即使禁用查询缓存,当使用标准 MySQL二进制时,这个值总是YES。

2.其他重要配置参数

查询缓存系统变量名以query_cache_ 开头,如下图,我们将逐一说明。

  • having_query_cache

    就不在细说了,主要是控制查询缓冲的开启与否。

  • query_cache_limit

    单个查询可以被缓存的具体查询结果的最大值。

  • query_cache_min_res_unit

    该参数是控制存储查询缓冲时候,分配的内存块大小。当查询进行的时候,但如果要保存的结果比较大,超过query_cache_min_res_unit的值 ,这时候mysql将一边检索结果,一边进行保存结果,所以,有时候并不是把所有结果全部得到后再进行一次性保存,而是每次分配一块 query_cache_min_res_unit 大小的内存空间保存结果集,使用完后,接着再分配一个这样的块,如果还不不够,接着再分配一个块,依此类推,也就是说,有可能在一次查询中,mysql要进行多次内存分配的操作。query_cache_min_res_unit默认值是4KB。 如果你有大量返回小结果数据的查询,默认数据块大小可能会导致内存碎片,显示为大量空闲内存块。由于缺少内存,内存碎片会强制查询缓存从缓存内存中修整(删除)查询。这时,你应该减少query_cache_min_res_unit变量的值,空闲块和由于修整而移出的查询的数量通过Qcache_free_blocks和Qcache_lowmem_prunes变量的值给出。当然 如果大量查询返回大结果(检查 Qcache_total_blocks和Qcache_queries_in_cache状态变量),你可以通过增加query_cache_min_res_unit变量的值来提高性。

  • query_cache_size

    查询缓存大小,设置为0表示禁用查询缓存。 默认缓存大小设置为0;也就是禁用查询缓存。当设置query_cache_size变量为非零值时,应记住查询缓存至少大约需要40KB来分配其数据结构。(具体大小取决于系统结构)。如果你把该值设置的太小,将会得到一个警告,且会将query_cache_size值设置为0。

  • query_cache_type

    该参数主要是控制缓存行为的。query_cache_type变量的GLOBAL值将决定更改后所有连接客户端的缓存行为。在linux下,可在my.cnf(在win下,可在my.ini)中进行配置。具体客户端可以通过设置query_cache_type变量的会话值控制它们本身连接的缓存行为。例如,一个客户可以禁用自己的查询缓存。 该参数有三种值如下

    • 0或OFF

      将阻止缓存或查询缓存结果

    • 1或ON

      将允许缓存,以SELECT SQL_NO_CACHE开始的查询语句除外。

    • 2或DEMAND

      仅对以SELECT SQL_CACHE开始的那些查询语句启用缓存

查询高速缓冲维护

碎片的清理

在前面,我们可以得知,使用缓存,不可避免内存碎片,我们可以使用FLUSH QUERY CACHE语句来清理查询缓存碎片,以提高内存使用性能。该语句不从缓存中移出任何查询。RESET QUERY CACHE语句从查询缓存中移出所有查询。FLUSH TABLES语句也执行同样的工作,区别optimize table tableName,关于optimize可以参考(http://blog.csdn.net/hsd2012/article/details/51485250)。

查询缓存性能监控

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

Qcache_free_blocks:缓存中相邻内存块的个数。数目大说明可能有碎片。执行FLUSH QUERY CACHE会对缓存中的碎片进行整理,只保留一个空闲块。

Qcache_free_memory:缓存中的空闲内存。

Qcache_hits:每次查询在缓存中命中时就增大

Qcache_inserts:每次插入一个查询时就增大。命中次数除以插入次数就是不中比率。

Qcache_lowmem_prunes:缓存出现内存不足,并且必须为了缓存新的查询,而从查询缓冲区中移出到自由内存中的查询的数目。这个数字最好长时间来看;如果这个 数字在不断增长,就表示可能碎片非常严重,或者内存很少。(上面的 Qcache_free_blocks和Qcache_free_memory可以告诉您属于哪种情况) 。从查询缓冲区移除查询缓冲,使用最近最少使用(LRU)策略。

Qcache_not_cached:不适合进行缓存的查询的数量,通常是由于这些查询不是 SELECT 语句或者用了now()之类的函数。

Qcache_queries_in_cache:当前缓存的查询(和响应)的数量。

Qcache_total_blocks:缓存中块的数量。

Qcache_total_blocks和Qcache_free_blocks可以显示查询缓存内存碎片。

备注

以上叙述,主要参考mysql手册。

时间: 2024-10-05 20:25:33

MySQL查询高速缓冲详解的相关文章

Mysql配置文件my.ini详解

原链接:http://blog.sina.com.cn/s/blog_718ac8bf0100pkvp.html 以下是Mysql数据库服务器配置文件my.ini的详细配置.应用场合是InnoDB引擎,2核CPU, 32位SUSE. [client] #password = your_password port  = 3306 socket  = /tmp/mysql.sock # Here follows entries for some specific programs # The MyS

mysql explain执行计划详解

1).id列SELECT识别符.这是SELECT查询序列号.这个不重要,查询序号即为sql语句执行的顺序 2).select_type列常见的有: A:simple:表示不需要union操作或者不包含子查询的简单select查询.有连接查询时,外层的查询为simple,且只有一个 B:primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type即为primary.且只有一个 C:union:union连接的两个select查询,第一个查询是de

MySQL 执行计划explain详解

MySQL 执行计划explain详解 2015-08-10 13:56:27 分类: MySQL explain命令是查看查询优化器如何决定执行查询的主要方法.这个功能有局限性,并不总会说出真相,但它的输出是可以获取的最好信息,值得花时间去了解,因为可以学习到查询是如何执行的. 调用EXPLAIN 在select之前添加explain,mysql会在查询上设置一个标记,当执行查询计划时,这个标记会使其返回关于执行计划中每一步的信息,而不是执行它.它会返回一行或多行信息,显示出执行计划中的每一部

MySQL中EXPLAIN命令详解

explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了: 如: explain select surname,first_name form a,b where a.id=b.id EXPLAIN列的解释: table:显示这一行的数据是关于哪张表的 type:这是重要的列,显示连接使用了何种类型.从最好到最差的连接类型为const.eq_reg.ref.range.in

Navicat for MySQL 选项设置技巧详解

Navicat for MySQL给用户提供了完整的用户自定义设置界面选项,从主菜单选择工具->选项,但是很多的用户第一次接触,对这方面如何设置不是很了解,本教程将详细的给大家介绍介绍Navicat for MySQL 选项设置技巧详解.希望可以帮到大家. Navicat for MySQL 常规选项 Navicat 常规选项主要包括以下内容: 窗口在工作列显示:每打开一个新窗口时会自动显示在 Windows 任务栏.停用该选项后,当退出 Navicat 主窗口时,所有窗口(例如:表.查询)将会

【转】Python中操作mysql的pymysql模块详解

Python中操作mysql的pymysql模块详解 前言 pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而后者不支持3.x版本. 本文测试python版本:2.7.11.mysql版本:5.6.24 一.安装 1 pip3 install pymysql 二.使用操作 1.执行SQL 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

mysql 自带工具详解

MySQL自带工具使用介绍:1)mysql命令:mysql命令事是使用最多的命令工具了,为用户提供了一个命令行接口来操作管理MySQL的服务器.命令格式:Usage:mysql [OPTIONS][database]例:mysql -e "select user,host from user" mysqlmysql --help 可以得到相应的基础使用帮助信息-e : --execut=name :我们要执行-e后面的命令,但是并不通过mysql连接进入mysql交互界面.此参数在我们

Python中操作mysql的pymysql模块详解

Python中操作mysql的pymysql模块详解 前言 pymsql是Python中操作MySQL的模块,pymysql支持python3.x. 一.安装 pip install pymysql 二.使用操作 1.执行SQL #!/usr/bin/env pytho # -*- coding:utf-8 -*- importpymysql # 创建连接 conn =pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd

重新学习MySQL数据库7:详解MyIsam与InnoDB引擎的锁实现

重新学习Mysql数据库7:详解MyIsam与InnoDB引擎的锁实现 说到锁机制之前,先来看看Mysql的存储引擎,毕竟不同的引擎的锁机制也随着不同. 三类常见引擎: MyIsam :不支持事务,不支持外键,所以访问速度快.锁机制是表锁,支持全文索引 InnoDB :支持事务.支持外键,所以对比MyISAM,InnoDB的处理效率差一些,并要占更多的磁盘空间保留数据和索引.锁机制是行锁,不支持全文索引(5.6以上支持) Memory:数据是存放在内存中的,默认哈希索引,非常适合存储临时数据,服