巧用query cache

标签: MySQL解错方案 Cache | 发表时间:2013-10-08 20:21 | 作者:OurMySQL
出处:http://ourmysql.com

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

同时应用报错超出了数据库的最大连接数: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的故障:

   

猜您喜欢

相关 [query cache] 推荐:

巧用query cache

- - OurMySQL
   收到一用户反馈其应用日志中狂报错误,获取连接超时:. 同时应用报错超出了数据库的最大连接数:max connections:. 这种情况很有可能是有慢sql占用了连接池中的连接没有释放,导致后续进来的请求迟迟获取不到连接池中的连接,导致请求报错,登录数据库排查发现如下sql出现执行非常的慢:.

MySQL Query Cache 小结

- Eneri - Sky.Jian 朝阳的天空
最近经常有人问我 MySQL Query Cache 相关的问题,就整理一点 MySQL Query Cache 的内容,以供参考. 顾名思义,MySQL Query Cache 就是用来缓存和 Query 相关的数据的. 具体来说,Query Cache 缓存了我们客户端提交给 MySQL 的 SELECT 语句以及该语句的结果集.

[MySQL FAQ]系列 — 为什么要关闭query cache,如何关闭

- - MySQL中文网
备注:插图来自淘宝苏普的博客并保留水印,如果觉得不当还请及时告知 :). 写在前面:MySQL的query cache大部分情况下其实只是鸡肋而已,建议全面禁用. 当然了,或许在你的场景下还是挺好的,还能发挥作用,那就继续使用吧,把本文当做参考就好. 不过,可能有的人人为只需要把 query_cache_size 大小调整为 0 就可以了,可以忽略 query_cache_type 参数的值,反正它也是可以在线调整的.

[MySQL FAQ]系列 — 线上环境到底要不要开启query cache

- - MySQL中文网
Query Cache(查询缓存,以下简称QC)存储SELECT语句及其产生的数据结果,特别适用于:频繁提交同一个语句,并且该表数据变化不是很频繁的场景,例如一些静态页面,或者页面中的某块不经常发生变化的信息. InnoDB Buffer Pool或者. MyISAM key buffer里读取结果.

Guava cache

- - 孟飞阳的博客
Guava Cache是一个全内存的本地缓存实现,它提供了线程安全的实现机制. 整体上来说Guava cache 是本地缓存的不二之选,简单易用,性能好.    Guava Cache有两种创建方式:.   通过这两种方法创建的cache,和通常用map来缓存的做法比,不同在于,这两种方法都实现了一种逻辑——从缓存中取key X的值,如果该值已经缓存过了,则返回缓存中的值,如果没有缓存过,可以通过某个方法来获取这个值.

Java Cache系列之Guava Cache

- - BlogJava-首页技术区
然而作为工具库中的一部分,我们自然不能期待Guava对Cache有比较完善的实现. 因而Guava中的Cache只能用于一些把Cache作为一种辅助设计的项目或者在项目的前期为了实现简单而引入. 在Guava CacheBuilder的注释中给定Guava Cache以下的需求:. 对于这样的需求,如果要我们自己来实现,我们应该怎么设计.

elasticsearch的javaAPI之query

- - CSDN博客云计算推荐文章
elasticsearch的javaAPI之query API. the Search API允许执行一个搜索查询,返回一个与查询匹配的结果(hits). 它可以在跨一个或多个index上执行, 或者一个或多个types. 查询可以使用提供的 query Java API 或filter Java API.

Cache-control使用Cache-control:private学习笔记

- - Web前端 - ITeye博客
网页缓存由 HTTP消息头中的Cache-control控制,常见取值有private、no-cache、max-age、must- revalidate等,默认为private. 其作用根据不同的重新浏览方式,分为以下几种情况:. 值为private、no-cache、must-revalidate,那么打开新窗口访问时都会重新访问服务器.

从free到page cache

- xiao - 博客园-MrDB's 技术随笔
我们经常用free查看服务器的内存使用情况,而free中的输出却有些让人困惑,如下:. 先看看各个数字的意义以及如何计算得到:. free命令输出的第二行(Mem):这行分别显示了物理内存的总量(total)、已使用的 (used)、空闲的(free)、共享的(shared)、buffer(buffer大小)、 cache(cache的大小)的内存.