巧用query cache

收到一用户反馈其应用日志中狂报错误,获取连接超时:

同时应用报错超出了数据库的最大连接数:max connections:

这种情况很有可能是有慢sql占用了连接池中的连接没有释放,导致后续进来的请求迟迟获取不到连接池中的连接,导致请求报错,登录数据库排查发现如下sql出现执行非常的慢:

mysql> select * from user where md5(nick)=’3f5950f59ddf2a0d14a44166040e348f’;
Empty set (1.32 sec)

一眼可以看出在nick上使用了md5函数,导致user表中的索引不能使用,而全表扫描:

mysql> explain select * from user where md5(nick)=’3f5950f59ddf2a0d14a44166040e348f?
+—-+————-+——-+——+—————+——+———+——+——–+————-+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+——-+——+—————+——+———+——+——–+————-+
| 1 | SIMPLE | user | ALL | NULL | NULL | NULL | NULL | 256608 | Using where |
+—-+————-+——-+——+—————+——+———+——+——–+————-+
1 row in set (0.00 sec)

通常情况下需要用户修改应用,将应用中的md5函数去掉,但是修改业务的方法还需要一段时间,不能够立刻是业务恢复,所以看看数据库还有没有其他的方法,灵机一动,由于该应用的场景是读多写非常少的应用,想到了query cache:

mysql> show variables like ‘%query%’;
+——————————+——————————————-+
| Variable_name | Value |
+——————————+——————————————-+
| ft_query_expansion_limit | 20 |
| have_query_cache | YES |
| long_query_time | 1.000000 |
| query_alloc_block_size | 8192 |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 0 |
| query_cache_type | ON |
| query_cache_wlock_invalidate | OFF |
| query_prealloc_size | 8192 |
| slow_query_log | ON |
| slow_query_log_file | /home/mysql/data3003/mysql/slow_query.log |
+——————————+——————————————-+
12 rows in set (0.00 sec)

mysql> set global query_cache_size=1024*1024*32;
Query OK, 0 rows affected (0.02 sec)

 

mysql> Ctrl-C — exit!
Aborted

root@xxxx ~
# my 3003
Entry Port ==== 3003
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4601147
Server version: 5.1.61-Alibaba-3930-log Source distribution

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql> use cuxiaowang_db
Database changed
mysql> select * from user where md5(nick)=’3f5950f59ddf2a0d14a44166040e348f?’;
Empty set (1.32 sec)

mysql> select * from user where md5(nick)=’3f5950f59ddf2a0d14a44166040e348f?
Empty set (0.00 sec)

可以看到查询能够很快的返回,应用立刻恢复正常。

PS:query cache的打开是有一定场景的,由于query cache并不适合更新,插入,删除非常大的应用,所以打开query cache一定要慎重,笔者曾经看到由于其数据库有大量的插入和更新的数据库打开query cache而导致整个数据库都在等待query cache的故障:

时间: 2024-09-19 23:58:39

巧用query cache的相关文章

mysql巧用query cache解决连接超时

应用日志中狂报错误,获取连接超时: 同时应用报错超出了数据库的最大连接数:max connections: 这种情况很有可能是有慢sql占用了连接池中的连接没有释放,导致后续进来的请求迟迟获取不到连接池中的连接,导致请求报错,登录数据库排查发现如下sql出现执行非常的慢: mysql> select * from user where md5(nick)='3f5950f59ddf2a0d14a44166040e348f';Empty set (1.32 sec) 一眼可以看出在nick上使用了

转贴一个有关MYSQL的文章.E文的.MySQLs Query Cache

cache|mysql A typical scenarioBoss: Our new website is crawling! How can it be, we have four state-of-the-art web servers - what's the problem?You: Well, the web servers are fine - it's the database server that's struggling.Boss: What? You told me th

MySQL SQL 分析 - 参数化查询 vs query cache 功能

query cache,  mysql 5 开始附带的一个功能, 与引擎无关, 只与数据查询语法相关.   测试描述: 当前使用中是 MySQL-5.6.14 Linux RHEL6  64 位系统产生环境,  使用 INNODB 引擎, 分配 innodb 2g 内存空间   [root@TiYanPlat ~]# uname -a Linux TiYanPlat 2.6.32-358.el6.x86_64 #1 SMP Tue Jan 29 11:47:41 EST 2013 x86_64

【转载】MySQL Query Cache 小结

      最近经常有人问我 MySQL Query Cache 相关的问题,就整理一点 MySQL Query Cache 的内容,以供参考.       顾名思义,MySQL Query Cache 就是用来缓存和 Query 相关的数据的.具体来说,Query Cache 缓存了我们客户端提交给 MySQL 的 SELECT 语句以及该语句的结果集.大概来讲,就是将 SELECT 语句和语句的结果做了一个 HASH 映射关系然后保存在一定的内存区域中.       在大部分的 MySQL

MySQL使用query cache缓存简单使用教程

1. query cache的key是sql字符串,并且要求精确匹配:大小写不一样或者多了一个空格,都会导致cache miss 2. query cache直接把用户输入的原始sql作为key, 不是把解析后或优化后的sql作为key,也不会把其中的子查询独立缓存 2. 存储过程中的sql结果不会被缓存 3. 如果一个sql会产生不确定的结果(即使表中数据没有变化也会不确定),比如select now(), MySQL就不会缓存它的结果 4. 只要表中数据有任何变化,就会导致本表相关的所有qu

MySQL · 源码分析 · Query Cache内部剖析

Query Cache背景 Query Cache在其他数据库里面也称为结果集缓存.顾名思义,它的目的是将SELECT语句与其返回结果缓存到Query Cache中,如果重复执行相同的SELECT语句的话,我们可以跳过MySQL的解析.优化.执行阶段,将SELECT的查询结果直接返回到客户端,加速SELECT语句的执行. Query Cache中的主要数据结构 Query_cache 对整个Query Cache进行管理,负责提供接口供Server调用. Query_cache_block Qu

pgpool-II 3.2 coming soon, get cool feature with it, on memory query cache and Built in HA

Almost one year worth of development, pgpool-II 3.2 release is getting closer. This version has two major new features: On memory query cache Built in HA On memory query cache is similar to MySQL's query cache.  Caching query SELECT query results by

MySql如何计算Key Hitrate ,Key Buffer Used, Query Cache Hitrate??请问.

问题描述 我在MySQL数据库中的information_schema 库里的GLOBAL_VARIABLES. GLOBAL_STATUS表可以取出来好多数据,比如:•key_buffer_size•key_cache_block_size•query_cache_limit•query_cache_size...等等 可是我不知道怎么计算Key Hitrate ,Key Buffer Used, Query Cache Hitrate 希望有人可以帮到我. 解决方案 mysql> show

MySQL的Query Cache原理分析_Mysql

原理 QueryCache(下面简称QC)是根据SQL语句来cache的.一个SQL查询如果以select开头,那么MySQL服务器将尝试对其使用QC.每个Cache都是以SQL文本作为key来存的.在应用QC之前,SQL文本不会被作任何处理.也就是说,两个SQL语句,只要相差哪怕是一个字符(例如大小写不一样:多一个空格等),那么这两个SQL将使用不同的一个CACHE. 不过SQL文本有可能会被客户端做一些处理.例如在官方的命令行客户端里,在发送SQL给服务器之前,会做如下处理:  过滤所有注释