http://blog.itpub.net/26515977/viewspace-1208188/           今天被MySQL Query Cache 炕了.线上大量 Waiting on query cache mutex 那么什么是 Query Cache? QC 缓存的是整个SELECT的结果集.而非执行计划.QC的为人原则是:执行查询最快的方式就是不去执行       但是.QC 简单粗暴的失效策略.令人蛋疼.任何不同(空格.TAB缩进.DML等)都会导致该表的Cache不可用…
今天被MySQL Query Cache 炕了.线上大量 Waiting on query cache mutex 那么什么是 Query Cache? QC 缓存的是整个SELECT的结果集.而非执行计划.QC的为人原则是:执行查询最快的方式就是不去执行     但是.QC 简单粗暴的失效策略.令人蛋疼.任何不同(空格.TAB缩进.DML等)都会导致该表的Cache不可用     失效通过single mutex 控制.有比较严重的锁竞争          如何关闭QC?     控制 2个参…
今天突然发现truncate一个表都慢到不行,于是 SHOW PROCESSLIST 发现错误:waiting for table metadata lock解决方法:查看information_schema.INNODB_TRX拥有事务的trx_mysql_thread_id,kill trx_mysql_thread_id回滚事务. 修改timeout默认值 mysql> show variables like 'innodb_lock_wait_timeout'; 参数支持范围为Sessi…
出现这个问题的原因是:mysql的配置文件中 max_allowed_packet 设置过小,mysql根据配置文件会限制server接受的数据包大小. 还有人会说我操作的数据量明显没有超过这个值为啥也失败了,因为:该值设置过小将导致单个记录超过限制后写入数据库失败,且后续记录写入也将失败.好了开始解决问题吧. 一.查看目前配置 1.使用root用户登录mysql: 2.执行语句查看当前的 max_allowed_packet. show VARIABLES like '%max_allowed…
前段时间做sql注入的时候  使用group_concat时,出现标题上的错误.经查阅一位大佬的博客,成功解决!故写此博文! 当mysql的sql_mode是only_full_group_by的时候,在不使用group by 并且select后面出现聚集函数的话,那么所有被select的都应该是聚集函数,否则就会报错! tips:在select指定的字段要么就要包含在group By语句的后面,作为分组的依据:要么就要被包含在聚合函数中.…
改进动态设置query cache导致额外锁开销的问题分析及解决方法 关键字:dynamic switch for query cache,  lock overhead for query cache 背景 Query Cache是MySQL Server层的一个非常好的特性,对于小数据集或访问量非常集中的应用场景,有非常好的性能提升,内部细节可以参考1,在此处不打算展开Query Cache的一些应用特性. Query Cache引入了一新的问题, 即如果你不想要Query Cache的功能…
最近经常有人问我 MySQL Query Cache 相关的问题,就整理一点 MySQL Query Cache 的内容,以供参考. 顾名思义,MySQL Query Cache 就是用来缓存和 Query 相关的数据的.具体来说,Query Cache 缓存了我们客户端提交给 MySQL 的 SELECT 语句以及该语句的结果集.大概来讲,就是将 SELECT 语句和语句的结果做了一个 HASH 映射关系然后保存在一定的内存区域中. 在大部分的 MySQL 分发版本中,Query Cache…
早上一打开网站,就看到了Percona官网发布的最新的关于 mysql query cache的文章: https://www.percona.com/blog/2015/08/07/mysql-query-cache-worst-enemy-best-friend/ 还有一篇对其评论的文章: https://blog.gslin.org/archives/2015/08/07/5906/percona-%E5%B0%8D-mysql_query_cache-%E7%9A%84%E6%B8%AC…
QueryCache(下面简称QC)是根据SQL语句来cache的.一个SQL查询如果以select开头,那么MySQL服务器将尝试对其使 用QC.每个Cache都是以SQL文本作为key来存的.在应用QC之前,SQL文本不会被作任何处理.也就是说,两个SQL语句,只要相差哪怕是一个 字符(例如大小写不一样:多一个空格等),那么这两个SQL将使用不同的一个CACHE. 不过SQL文本有可能会被客户端做一些处理.例如在官方的命令行客户端里,在发送SQL给服务器之前,会做如下处理: 过滤所有注释 去…
query cache原理 当mysql接收到一条select类型的query时,mysql会对这条query进行hash计算而得到一个hash值,然后通过该hash值到query cache中去匹配,如果没有匹配中,则将这个hash值存放在一个hash链表中,同时将query的结果集存放进cache中,存放hash值的链表的每一个hash节点存放了相应query结果集在cache中的地址,以及该query所涉及到的一些table的相关信息:如果通过hash值匹配到了一样的query,则直接将c…