求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
  
 
 
     
   
分享到
MySQL 查询缓存的实际应用代码示例
 

发布于2013-5-23

 

以下的文章主要介绍的是MySQL 查询缓存的实际应用代码以及查看MySQL 查询缓存的大小 ,碎片整理,清除缓存以及监视MySQL 查询缓存性能的相关内容的描述,以下就是具体内容的描述,希望在你今后的学习中会有所帮助。

MySQL> select @@query_cache_type;  
+--------------------+
| @@query_cache_type |
+--------------------+
| ON |
+--------------------+
MySQL> set query_cache_type=off;
MySQL> set query_cache_type=on;
MySQL>
MySQL> select sql_cache id, title, body from article;
MySQL> select sql_no_cache id, title, body from article;
MySQL> show variables like 'have_query_cache';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| have_query_cache | YES |
+------------------+-------+
1 row in set (0.00 sec)

查看MySQL 查询缓存的大小

MySQL> select @@global.query_cache_size;  
+---------------------------+
| @@global.query_cache_size |
+---------------------------+
| 16777216 |
+---------------------------+
1 row in set (0.00 sec)
MySQL> select @@query_cache_size;
+--------------------+
| @@query_cache_size |
+--------------------+
| 16777216 |
+--------------------+
1 row in set (0.00 sec)

查看最大缓存结果,如果结果集大于该数,不缓存。

MySQL> select @@global.query_cache_limit;
+----------------------------+
| @@global.query_cache_limit |
+----------------------------+
| 1048576 |
+----------------------------+
1 row in set (0.00 sec)

碎片整理

MySQL> flush query cache
-> ;
Query OK, 0 rows affected (0.00 sec)

清除缓存

MySQL> reset query cache
-> ;
Query OK, 0 rows affected (0.00 sec)

监视MySQL 查询缓存性能:

MySQL> flush tables;
Query OK, 0 rows affected (0.04 sec)
MySQL> show status like 'qcache%';
+-------------------------+----------+
| Variable_name | Value |
+-------------------------+----------+
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 16768408 |
| Qcache_hits | 6 |
| Qcache_inserts | 36 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 86 |
| Qcache_queries_in_cache | 0 |
| Qcache_total_blocks | 1 |
+-------------------------+----------+
8 rows in set (0.06 sec)

看看当前缓存中有多少条信息:

MySQL> show status like 'qcache_q%';
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| Qcache_queries_in_cache | 0 |
+-------------------------+-------+
1 row in set (0.00 sec)
MySQL> select sql_cache id, title, body from article;
MySQL> show status like 'qcache_q%';
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| Qcache_queries_in_cache | 1 |
+-------------------------+-------+
1 row in set (0.00 sec)
MySQL> show status like 'qcache_f%';
+--------------------+----------+
| Variable_name | Value |
+--------------------+----------+
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 16766728 |
+--------------------+----------+
2 rows in set (0.00 sec)

以下的文章主要讲述的是MySQL缓存查询与设置global query_cache_size的实际操作步骤,我们大家都知道其访问量一增加的话,MySQL数据库的压力就大!如果对其减小压力呢?首先缓存。

我这里有专业数据师来讲解。

设置缓存global query_cache_size

set global query_cache_size = 102760448;
set global query_cache_limit = 2097152;
set global query_cache_size = 600000;

缓存机制简单的说就是缓存sql文本及查询结果,如果运行相同的sql,服务器直接从缓存中取到结果,而不需要再去解析和执行sql。如果表更改了,那么使用这个表的所有缓冲查询将不再有效,查询缓存值的相关条目被清空。更改指的是表中任何数据或是结构的改变,包括INSERT、UPDATE、DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE等,也包括那些映射到改变了的表的使用MERGE表的查询。显然,这对于频繁更新的表,MySQL缓存查询缓存是不适合的,而对于一些不常改变数据且有大量相同sql查询的表,查询缓存会节约很大的性能。

查询必须是完全相同的(逐字节相同)才能够被认为是相同的。另外,同样的查询字符串由于其它原因可能认为是不同的。使用不同的数据库、不同的协议版本或者不同默认字符集的查询被认为是不同的查询并且分别进行缓存。

下面sql查询缓存认为是不同的:

SELECT * FROM tbl_name
Select * from tbl_name

查询缓存相关参数

MySQL> SHOW VARIABLES LIKE '%query_cache%';
+------------------------------+---------+ | Variable_name | Value |
+------------------------------+---------+ | have_query_cache | YES |

查询缓存是否可用 | query_cache_limit | 1048576 | --可缓存具体查询结果的最大值 | query_cache_min_res_unit | 4096 | | query_cache_size | 599040 | --查询缓存的大小 | query_cache_type | ON | --阻止或是支持MySQL缓存查询缓存

| query_cache_wlock_invalidate | OFF | +------------------------------+---------+

下面是一个简单的例子:

[MySQL@csdba1850 ~]$ MySQL -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.0.45-community MySQL Community Edition (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
MySQL> set global query_cache_size = 600000;

设置缓存内存

Query OK, 0 rows affected (0.00 sec)
MySQL> set session query_cache_type = ON;

开启查询缓存

Query OK, 0 rows affected (0.00 sec)
MySQL> use test Reading table information for completion
of table and column names You can turn off this feature to
get a quicker startup with -A Database changed mysql> show tables;
+----------------+ | Tables_in_test | +----------------+ | animals |
| person | +----------------+ 5 rows in set (0.00 sec)
mysql> select count(*) from animals; +----------+ | count(*)
| +----------+ | 6 | +----------+ 1 row in set (0.00 sec)

Qcache_hits表示mysql缓存查询在缓存中命中的累计次数,是累加值。

mysql> SHOW STATUS LIKE 'Qcache_hits'; +---------------+-------+
| Variable_name | Value | +---------------+-------+ | Qcache_hits
| 0 | --0次 +---------------+-------+ 8 rows in set (0.00 sec)
mysql> select count(*) from animals; +----------+ | count(*)
| +----------+ | 6 | +----------+ 1 row in set (0.00 sec)
mysql> SHOW STATUS LIKE 'Qcache%'; +---------------+-------+
| Variable_name | Value | +---------------+-------+ | Qcache_hits | 1 |

表示sql在缓存中直接得到结果,不需要再去解析

+---------------+-------+ 8 rows in set (0.00 sec)
mysql> select count(*) from animals; +----------+
| count(*) | +----------+ | 6 | +----------+ 1 row in set (0.00 sec)
mysql> select count(*) from animals; +----------+ | count(*)
| +----------+ | 6 | +----------+ 1 row in set (0.00 sec)
mysql> SHOW STATUS LIKE 'Qcache_hits'; +---------------+-------+
| Variable_name | Value | +---------------+-------+ | Qcache_hits | 3 |

上面的sql也是是从缓存中直接取到结果

+---------------+-------+ 1 row in set (0.00 sec) mysql> insert into animals select 9,'testsds' ;

插入数据后,跟这个表所有相关的sql缓存就会被清空掉

Query OK, 1 row affected (0.00 sec) Records:
1 Duplicates: 0 Warnings: 0 mysql> select count(*) from animals;
+----------+ | count(*) | +----------+ | 7 | +----------+
1 row in set (0.00 sec) mysql> SHOW STATUS LIKE 'Qcache_hits';
+---------------+-------+ | Variable_name | Value |
+---------------+-------+ | Qcache_hits | 3 |

还是等于3,说明上一条sql是没有直接从缓存中直接得到的

+---------------+-------+ 1 row in set (0.00 sec)
mysql> select count(*) from animals; +----------+
| count(*) | +----------+ | 7 | +----------+
1 row in set (0.00 sec) mysql> SHOW STATUS LIKE 'Qcache_hits';
+---------------+-------+ | Variable_name | Value | +---------------+-------+
| Qcache_hits | 4 | +---------------+-------+ 1 row in set (0.00 sec)

以上的相关内容就是对mysql缓存查询和设置的介绍,望你能有所收获。

相关文章 相关文档 相关视频



我们该如何设计数据库
数据库设计经验谈
数据库设计过程
数据库编程总结
数据库性能调优技巧
数据库性能调整
数据库性能优化讲座
数据库系统性能调优系列
高性能数据库设计与优化
高级数据库架构师
数据仓库和数据挖掘技术
Hadoop原理、部署与性能调优
 
分享到
 
 


MySQL索引背后的数据结构
MySQL性能调优与架构设计
SQL Server数据库备份与恢复
让数据库飞起来 10大DB2优化
oracle的临时表空间写满磁盘
数据库的跨平台设计
更多...   


并发、大容量、高性能数据库
高级数据库架构设计师
Hadoop原理与实践
Oracle 数据仓库
数据仓库和数据挖掘
Oracle数据库开发与管理


GE 区块链技术与实现培训
航天科工某子公司 Nodejs高级应用开发
中盛益华 卓越管理者必须具备的五项能力
某信息技术公司 Python培训
某博彩IT系统厂商 易用性测试与评估
中国邮储银行 测试成熟度模型集成(TMMI)
中物院 产品经理与产品管理
更多...