- 浏览: 1022827 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (529)
- 服务器 (8)
- jsp (1)
- java (6)
- AIX (1)
- solaris (3)
- linux学习 (53)
- javaScript (2)
- hibernate (1)
- 数据库 (74)
- sql语句 (8)
- oracle 学习 (75)
- oracle 案例 (42)
- oracle 管理 (42)
- Oracle RAC (27)
- oracle data guard (12)
- oracle 参数讲解 (14)
- Oracle 字符集 (8)
- oracle性能调优 (24)
- oracle备份与恢复 (12)
- oracle Tablespace (9)
- oracle性能诊断艺术 (1)
- oracle 11g学习 (5)
- oracle streams (1)
- oracle upgrade and downgrade (4)
- db2学习 (13)
- db2命令学习 (2)
- mysql (28)
- sql server (30)
- sql server 2008 (0)
- 工具 (10)
- 操作系统 (3)
- c++ (1)
- stock (1)
- 生活 (5)
- HADOOP (2)
最新评论
-
massjcy:
...
如何将ubuntu文件夹中文名改为英文 -
skypiea:
谢谢。。。
终于解决了。。。
Oracle 10.2.0.4(5)EM不能启动的解决方案(Patch 8350262) -
qwe_rt:
引用vi /etc/sysconfig/network 请问 ...
Linux操作系统下配置静态IP上网 -
liuqiang:
sudo killall -9 apache2
ps 和 kill 命令详解 -
dazuiba:
引用*绝杀 kill -9 PID 当使用此命令时,一定要通过 ...
ps 和 kill 命令详解
本文转自:http://isky000.com/database/mysql-query-cache-summary
最近经常有人问我 MySQL Query Cache 相关的问题,就整理一点 MySQL Query Cache 的内容,以供参考。
顾名思义,MySQL Query Cache 就是用来缓存和 Query 相关的数据的。具体来说,Query Cache 缓存了我们客户端提交给 MySQL 的 SELECT 语句以及该语句的结果集。大概来讲,就是将 SELECT 语句和语句的结果做了一个 HASH 映射关系然后保存在一定的内存区域中。
在大部分的 MySQL 分发版本中,Query Cache 功能默认都是打开的,我们可以通过调整 MySQL Server 的参数选项打开该功能。主要由以下5个参数构成:
- query_cache_limit:允许 Cache 的单条 Query 结果集的最大容量,默认是1MB,超过此参数设置的 Query 结果集将不会被 Cache
- query_cache_min_res_unit:设置 Query Cache 中每次分配内存的最小空间大小,也就是每个 Query 的 Cache 最小占用的内存空间大小
- query_cache_size:设置 Query Cache 所使用的内存大小,默认值为0,大小必须是1024的整数倍,如果不是整数倍,MySQL 会自动调整降低最小量以达到1024的倍数
-
query_cache_type:控制 Query Cache 功能的开关,可以设置为0(OFF),1(ON)和2(DEMAND)三种,意义分别如下:
- 0(OFF):关闭 Query Cache 功能,任何情况下都不会使用 Query Cache
- 1(ON):开启 Query Cache 功能,但是当 SELECT 语句中使用的 SQL_NO_CACHE 提示后,将不使用Query Cache
- 2(DEMAND):开启 Query Cache 功能,但是只有当 SELECT 语句中使用了 SQL_CACHE 提示后,才使用 Query Cache
- query_cache_wlock_invalidate:控制当有写锁定发生在表上的时刻是否先失效该表相关的 Query Cache,如果设置为 1(TRUE),则在写锁定的同时将失效该表相关的所有 Query Cache,如果设置为0(FALSE)则在锁定时刻仍然允许读取该表相关的 Query Cache。
Query Cache 如何处理子查询的?
这是我遇到的最为常见的一个问题。其实 Query Cache 是以客户端请求提交的 Query 为对象来处理的,只要客户端请求的是一个 Query,无论这个 Query 是一个简单的单表查询还是多表 Join,亦或者是带有子查询的复杂 SQL,都被当作成一个 Query,不会被分拆成多个 Query 来进行 Cache。所以,存在子查询的复杂 Query 也只会产生一个Cache对象,子查询不会产生单独的Cache内容。UNION[ALL] 类型的语句也同样如此。
Query Cache 是以 block 的方式存储的数据块吗?
不是,Query Cache 中缓存的内容仅仅只包含该 Query 所需要的结果数据,是结果集。当然,并不仅仅只是结果数据,还包含与该结果相关的其他信息,比如产生该 Cache 的客户端连接的字符集,数据的字符集,客户端连接的 Default Database等。
Query Cache 为什么效率会非常高,即使所有数据都可以 Cache 进内存的情况下,有些时候也不如使用 Query Cache 的效率高?
Query Cache 的查找,是在 MySQL 接受到客户端请求后在对 Query 进行权限验证之后,SQL 解析之前。也就是说,当 MySQL 接受到客户端的SQL后,仅仅只需要对其进行相应的权限验证后就会通过 Query Cache 来查找结果,甚至都不需要经过 Optimizer 模块进行执行计划的分析优化,更不许要发生任何存储引擎的交互,减少了大量的磁盘 IO 和 CPU 运算,所以效率非常高。
客户端提交的 SQL 语句大小写对 Query Cache 有影响吗?
有,由于 Query Cache 在内存中是以 HASH 结构来进行映射,HASH 算法基础就是组成 SQL 语句的字符,所以必须要整个 SQL 语句在字符级别完全一致,才能在 Query Cache 中命中,即使多一个空格也不行。
一个 SQL 语句在 Query Cache 中的内容,在什么情况下会失效?
为了保证 Query Cache 中的内容与是实际数据绝对一致,当表中的数据有任何变化,包括新增,修改,删除等,都会使所有引用到该表的 SQL 的 Query Cache 失效。
为什么我的系统在开启了 Query Cache 之后整体性能反而下降了?
当开启了 Query Cache 之后,尤其是当我们的 query_cache_type 参数设置为 1 以后,MySQL 会对每个 SELECT 语句都进行 Query Cache 查找,查找操作虽然比较简单,但仍然也是要消耗一些 CPU 运算资源的。而由于 Query Cache 的失效机制的特性,可能由于表上的数据变化比较频繁,大量的 Query Cache 频繁的被失效,所以 Query Cache 的命中率就可能比较低下。所以有些场景下,Query Cache 不仅不能提高效率,反而可能造成负面影响。
如何确认一个系统的 Query Cache 的运行是否健康,命中率如何,设置量是否足够?
MySQL 提供了一系列的 Global Status 来记录 Query Cache 的当前状态,具体如下:
- Qcache_free_blocks:目前还处于空闲状态的 Query Cache 中内存 Block 数目
- Qcache_free_memory:目前还处于空闲状态的 Query Cache 内存总量
- Qcache_hits:Query Cache 命中次数
- Qcache_inserts:向 Query Cache 中插入新的 Query Cache 的次数,也就是没有命中的次数
- Qcache_lowmem_prunes:当 Query Cache 内存容量不够,需要从中删除老的 Query Cache 以给新的 Cache 对象使用的次数
- Qcache_not_cached:没有被 Cache 的 SQL 数,包括无法被 Cache 的 SQL 以及由于 query_cache_type 设置的不会被 Cache 的 SQL
- Qcache_queries_in_cache:目前在 Query Cache 中的 SQL 数量
- Qcache_total_blocks:Query Cache 中总的 Block 数量
可以根据这几个状态计算出 Cache 命中率,计算出 Query Cache 大小设置是否足够,总的来说,我个人不建议将 Query Cache 的大小设置超过256MB,这也是业界比较常用的做法。
MySQL Cluster 是否可以使用 Query Cache?
其实在我们的生产环境中也没有使用 MySQL Cluster,所以我也没有在 MySQL Cluster 环境中使用 Query Cache 的实际经验,只是 MySQL 文档中说明确实可以在 MySQL Cluster 中使用 Query Cache。从 MySQL Cluster 的原理来分析,也觉得应该可以使用,毕竟 SQL 节点和数据节点比较独立,各司其职,只是 Cache 的失效机制会要稍微复杂一点。
发表评论
-
MySQL全连接(Full Join)实现
2012-07-09 18:18 4222MYSQL 可以用 union 实现全连接 mysql> ... -
Mysql Query Cache学习篇
2012-03-19 14:32 968基础介绍篇: QueryCache是用来缓存select语句 ... -
max_length_for_sort_data
2012-03-08 11:11 1401这段时间mysql 数据库的性能明显降低,iowait达到了 ... -
BlackHole :黑洞引擎
2012-02-03 14:42 1159BlackHole :黑洞引擎,写入的任何数据都会消失,用于记 ... -
正确重置MySQL密码
2012-02-03 00:51 749谁都不想弄丢家门钥匙,但不管多么小心,时间长了,这样的事情总会 ... -
MYSQL--my.cnf配置中文详解
2012-02-02 22:55 931mysqld程序--目录和文件 ... -
MYSQL EXPLAIN
2012-02-01 20:24 900对于经常使用mysql的兄弟们,对explain一定不会 ... -
基于MySQL的高可用可扩展架构探讨(转)
2011-03-24 23:38 811随着信息量飞涨,信息的存储成为了这个时代至关重要的一项技术。如 ... -
MySQL性能优化的参数简介
2011-03-24 23:18 699公司网站访问量越来越 ... -
mysql replication原理介绍
2011-03-24 23:04 1040要想用好一个系统,理解其实现原理是非常重要的事情,只有理解了其 ... -
如何为用户设置密码
2011-03-24 22:27 758当初次在机器上安装完Mysql时,你可以匿名进行访问数据库或者 ... -
MySQL数据的导出和导入工具:mysql
2011-03-24 22:24 754导出要用到MySQL的mysqldum ... -
How to Backup a MyISAM / InnoDB MySQL Database
2011-03-24 22:19 941Whichever MySQL storage engine ... -
加大mysql的最大连接数
2011-03-24 22:10 827mysql的最大连接数默认是100, 这个数值对于并发连接很多 ... -
MySQL服务器安装完之后如何调节性能
2011-03-24 22:04 698My favorite question during Int ... -
MySQL 性能优化的简单办法
2011-03-24 21:50 1482优化数据库最核心的实际上就是配置参数的调整。本文通过一个简单的 ... -
Mysql 占用cpu资源高
2011-03-24 21:44 1161朋友主机(Windows 2003 + IIS ... -
MySQL慢查询分析mysqldumpslow
2011-03-24 21:40 1050MySQL优化的第一步应该做的就是排查问题,找出瓶颈,而通常情 ... -
打开MySQL的慢查询记录
2011-03-24 21:38 923打开MySQL慢查询MySQL慢查询记录日志对于跟踪PHP+M ... -
MySQL Back to Basics:Analyze,Check,Optimize, and Repair
2011-03-24 01:33 879It felt like the right time for ...
相关推荐
1.4 小结 第2章 MySQL架构组成 2.0 引言 2.1 MySQL物理文件组成 2.2 MySQL Server系统架构 2.3 MySQL 自带工具使用介绍 2.4 小结 第3章 MySQL存储引擎简介 3.0 引言 ...
1.4 小结 第2章 MySQL架构组成 2.0 引言 2.1 MySQL物理文件组成 2.2 MySQL Server系统架构 2.3 MySQL自带工具使用介绍 2.4 小结 第3章 MySQL存储引擎简介 3.0 引言 3.1 MySQL存储引擎概述 3.2 MyISAM存储...
6. **QUERY_CACHE_SIZE**: 查询缓存大小,可以加速重复查询的处理。然而,如果查询变化频繁,查询缓存可能反而降低性能,因此需要谨慎调整。 7. **THREAD_CONCURRENCY**: 控制同时运行的线程数量,以避免过多资源...
### MySQL CPU占用高的问题解决方法小结 #### 问题背景 最近发现php网站发布信息比较慢,而且同网站目录下的asp程序经常出现登录后立即重新登录的情况。经过调查,发现这是由于服务器资源占用过高所导致的。具体...
其次,MySQL从4.0.1版本开始引入了查询缓存(query cache),它可以显著提高查询效率。`query_cache_size`决定了缓存查询结果的最大内存。如果`Qcache_hits`的值非常高,意味着查询缓存被频繁使用,可以考虑增大`...
2.6 小结 70 第二部分 故障诊断与性能优化篇 第3章 故障诊断 72 3.1 影响mysql性能的因素 72 3.2 系统性能评估标准 73 3.2.1 影响linux服务器性能的因素 73 3.2.2 系统性能评估指标 74 3.2.3 开源监控和评估...
### 小结 “高性能MySQL”这本书深入浅出地介绍了如何实现MySQL的高性能,不仅适用于初学者入门,也适合有一定经验的技术人员进阶学习。通过对MySQL基础知识的回顾、性能优化关键点的梳理,可以帮助读者构建起一个...
【PHP技巧小结】 在PHP开发中,掌握一些实用技巧能极大地提高工作效率和代码质量。以下是一些在PHP工作中常见的技巧: 1. **定义Linux和Windows通用的文件分隔符号** 在PHP中,可以使用内置常量`DIRECTORY_...
$result = @mysql_query($sql, $Connect); // 输出标题和字段名 echo("数据库名:$DB_DBName,数据表:$DB_TBLName,备份日期:$now_date\n"); for ($i = 0; $i < mysql_num_fields($result); $i++) { echo mysql_field...
1.3 本章小结 这一章主要介绍了Hibernate的基本概念和使用方法,包括配置、查询、缓存和事务管理。掌握这些基础,将为后续深入学习和应用Hibernate打下坚实的基础。 1.4 思考与练习 这部分通常会提出一些问题,如...