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%E8%A9%A6-%E4%BB%A5-magento-%E7%82%BA%E4%BE%8B/

主要内容就是:

1. mysql的query cache有一个缺点:

The query cache is well known for its contentions: a global mutex has to be acquired for any read or write operation, which means that any access is serialized. This was not an issue 15 years ago, but with today’s multi-core servers, such serialization is the best way to kill performance.

对query cache 的读和写都必须要获得一个全局锁,也就是必须都得串行。所以当select并发很多时,必然造成锁的竞争。降低性能。

但是原文又称:

However from a performance point of view, any query cache hit is served in a few tens of microseconds while the fastest access with InnoDB (primary lookup) still requires several hundreds of microseconds. Yes, the query cache is at least an order of magnitude faster than any query that goes to InnoDB.

缓存命中的话,只要几十毫秒,如果没有命中,而走主键索引的话,需要几百毫秒。但是他这里没有考虑,如果我们将主键索引放入缓存呢?

就算这样,原文实际测试的结果却恰恰说明了,关闭query cache,mysql有更好的并发和throutput.

第二个链接后面有人评论:

這個我有做過類似的試驗, 結果也很類似, 主要原因是 query cache 還是有 cost, 硬體規格不高時的確有點用處, 但是當 query 數量超過某個級數後, 就像文中數據顯示的結果一樣, 性能就會下降, buffer 開大也沒用, 反而要停用 query cache 才能保證輸出效能.(很简单,就是全局锁的竞争导致的)

如果要開 query cache, 只要開 1MB 就夠了, 開再多也不會有太大的提升

只要是 software cache 都有這個問題, 為了解決這個問題, server 級的 CPU 的 L3 cache 都很大, 可以有效提升效能及輸出.

關於 PK search, 跟 mysql 的 key buffer 有關. mysql 的 key buffer 的確要開大, 因為這是放 index 用的, 要開到足夠放進所有的 index, 開太小放不進所有 index, 就不能保證效能了.(但是 key_buffer_size貌似只对myisam有作用吧?)

时间: 2024-10-05 21:04:43

MySQL 之 query cache的相关文章

memcached和MySQL的query cache相比

把memcached引入应用中,还是需要不少工作量的.MySQL有个使用方便的query cache,可以自动地缓存SQL查询的结果,被缓存的SQL查询可以被反复地快速执行.Memcached与之相比,怎么样呢?MySQL的query cache是集中式的,连接到该query cache的MySQL服务器都会受益. * 当您修改表时,MySQL的query cache会立刻被刷新(flush).存储一个memcached item只需要很少的时间,但是当写操作很频繁时,MySQL的query c

mysql query cache优化

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

MySQL Query Cache 相关的问题

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

RDS for MySQL查询缓存 (Query Cache) 的设置和使用

https://help.aliyun.com/knowledge_detail/41717.html?spm=5176.7841698.2.11.aCvOXJ RDS for MySQL查询缓存 (Query Cache) 的设置和使用 功能和适用范围 原理 限制 设置 验证效果 1. 功能和适用范围 功能: 降低 CPU 使用率 降低 IOPS 使用率(某些情况下) 减少查询响应时间,提高系统的吞吐量 适用范围: 表数据修改不频繁.数据较静态 查询(Select)重复度高 查询结果集小于 1

关闭mysql查询缓存query cache(用户测试性能)

先对query cache进行查询 mysql> show global variables like '%cache%'; 查看query_cache_size.query_cache_type的值 临时修改,重启后将还原默认. mysql> set global query_cache_size=0; mysql> set query_cache_type=0; 备注:query_cache_size是一个全局变量,必须加global:query_cache_type可加可不加 永久

1011MySQL Query Cache学习笔记

转自:http://blog.chinaunix.net/uid-16844903-id-321156.html 测试环境 MySQL 5.5 innodb_version 1.1.6 MySQL Query Cache就是用来缓存和 Query 相关的数据的.具体来说,Query Cache 缓存了我们客户端提交给 MySQL 的 SELECT 语句以及该语句的结果集.大概来讲,就是将 SELECT 语句和语句的结果做了一个 HASH 映射关系然后保存在一定的内存区域中. mysql> sho

Mysql slow query log

一.概念部分:  顾名思义,慢查询日志中记录的是执行时间较长的query,也就是我们常说的slow query,通过设--log-slow-queries[=file_name]来打开该功能并设置记录位置和文件名,默认文件名为hostname-slow.log,默认目录也是数据目录.     慢查询日志采用的是简单的文本格式,可以通过各种文本编辑器查看其中的内容.其中记录了语句执行的时刻,执行所消耗的时间,执行用户,连接主机等相关信息.MySQL还提供了专门用来分析满查询日志的工具程序mysql

Hibernate Cache:Session Cache、Second Level Cache、Query Cache

Hibernate中提供了对Cache的支持,用于减少一些必要的数据访问.这个功能如果能够正确的使用,程序性能会有很大的提升.但是很多时候,我们使用的可能不正确的. Hibernate中Cache的类型 Hibernate中提供了三种类型的Cache,这里的说法很可能与网上说法有些区别,网上的大多数说法是将Hibernate中的Cache分为一级缓存和二级缓存.我将他们分为3种: 1)Session Cache : 把对象缓存在current session对象中 2)Second Level

开启Query Cache导致的一个报错

今天报警一条error:host xxxx has more lowmem_prunes,please add Memory... 这个报警是一个shell脚本写的 Qcache_lowmem_prunes=`$Procedure_source -h$host -P$Port -uadmin  -pxxxx -e"show status" | grep "Qcache_lowmem_prunes" | awk '{print $2}'` if [ $Qcache_l