巧用query cache

标签: MySQL解错方案 Cache | 发表时间:2013-10-08 12: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 中query_cache_size小结

- - jackyrong
   MySQL查询缓存保存查询返回的完整结果. 当查询命中该缓存,会立刻返回结果,跳过了解析,优化和执行阶段. 查询缓存会跟踪查询中涉及的每个表,如果这写表发生变化,那么和这个表相关的所有缓存都将失效. 但是随着服务器功能的强大,查询缓存也可能成为整个服务器的资源竞争单点.    默认这个开关是关闭的,就是禁止使用query_cache,查询是否使用语句如下:.

对于mysql的query_cache认识的误区

- - OurMySQL
一直以来,对于mysql的query_ cache,在网上就流行着这样的说法,“对于mysql的query_cache键值就是mysql的query,所以,如果在query中有任何的不同,包括多了个空格,都会导致mysql认为是不同的查询”,其实,这一种说法是不完全正确的. 首先第一点,mysql的query_cache的键值并不是简单的query,而是query加databasename加flag.

[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.