城乡与建设厅网站首页,排名前50名免费的网站,网络服务调查问卷,怎样制作一个app软件1.概述#xff1a;MySQL Query Cache 缓存客户端提交给MySQL的SELECT#xff08;注意只是select#xff09;语句以及该语句的结果集。注意#xff1a;query_cache是mysql server端的查询缓存#xff0c;在存储引擎之上。存储引擎层还有存储引擎的缓存#xff0c;表也有表… 1.概述 MySQL Query Cache 缓存客户端提交给MySQL的SELECT注意只是select语句以及该语句的结果集。注意query_cache是mysql server端的查询缓存在存储引擎之上。存储引擎层还有存储引擎的缓存表也有表的缓存日志也有日志的缓存还可以用nosql实现二级三级甚至更多层的缓存.....缓存是提高性能的上方宝剑因为内存的速度比磁盘的速度要快的多的多宁愿在内存中执行1000次也不在磁盘上执行一次缓存可以跳过解析和优化的操作从而大幅度提高查询性能。更具体的可以看源码sql/sql_cache.cc 。2.mysql的Query Cache原理 客户端的select语句通过一定的hash算法进行计算存放在hash桶中并对结果集存放在内存中存放query hash值的链表中存放了hash值和结果集的内存地址和query涉及的所有table的标识等信息。前端的sql过来会先进行hash计算如果能够在cache中找到就直接从内存中取出结果返回给前端如果没有则mysql解析器会对sql进行解析并且优化。注意查询cache是在sql解析器前执行的所有速度非常快因为又省去了一个操作。3.失效机制 当后端任何一个表的一条数据索引结构发生变化时就会将与此表关联的query chache失效并且释放内存。所以对于数据变化频繁的sql就不要cache了。那样不但不会提高性能还能得到相反的结果因为每次多了查询缓存的操作。 这里要指出的是这种失效机制并不科学因为有些表的改动并不会导致结果集的改变。但是这种方法简单开销也比较小。4.相关设置参数SHOW VARIABLES LIKE %query_cache%query_cache_limit允许 Cache 的单条 Query 结果集的最大容量默认是1MB超过此参数设置的 Query 结果集将不会被 Cachequery_cache_min_res_unit设置 Query Cache 中每次分配内存的最小空间大小也就是每个 Query 的 Cache 最小占用的内存空间大小默认4KB要设置合理不然会造成碎片过多造成内存的浪费。query_cache_size设置 Query Cache 所使用的内存大小默认值为0大小必须是1024的整数倍如果不是整数倍MySQL 会自动调整降低最小量以达到1024的倍数query_cache_type控制 Query Cache 功能的开关可以设置为0(OFF),1(ON)和2(DEMAND)三种意义分别如下 0(OFF)关闭 Query Cache 功能任何情况下都不会使用 Query Cache 1(ON)开启 Query Cache 功能但是当 SELECT 语句中使用的 SQL_NO_CACHE 提示后将不使用Query Cache 2(DEMAND)开启 Query Cache 功能但是只有当 SELECT 语句中使用了 SQL_CACHE 提示后才使用 Query Cachequery_cache_wlock_invalidate控制当有写锁定发生在表上的时刻是否先失效该表相关的 Query Cache如果设置为 1(TRUE)则在写锁定的同时将失效该表相关的所有Query Cache如果设置为0(FALSE)则在锁定时刻仍然允许读取该表相关的 Query Cache。默认false5.Query Cache 处理子查询 Query Cache 是以客户端请求提交的Query 为对象来处理的只要客户端请求的是一个Query无论这个 Query 是一个简单的单表查询还是多表 Join亦或者是带有子查询的复杂 SQL都被当作成一个Query不会被分拆成多个Query 来进行Cache。所以存在子查询的复杂Query 也只会产生一个Cache对象子查询不会产生单独的Cache内容。UNION[ALL] 类型的语句也同样如此。6.Query Cache 导致性能反而下降的原因 1.开启Query Cache并且query_cache_type 参数设置为1或者是2但是缓存了太多的不必要sql导致MySQL 对每个SELECT 语句都进行Query Cache 查找这样就比直接查找多一次查找缓存的操作 2.并且由于Query Cache 的失效机制的特性比如表上的数据变化比较频繁大量的 Query Cache 频繁的被失效所以 Query Cache 的命中率就可能非常低 3.query_cache_min_res_unit设置不合理导致内存碎片太多 4.query cache 缓存的是结果集而不是数据页所以由于sql写的不合理导致同一结果集的sql 被缓存多次浪费内存。字符大小写、空格或者注释的不同缓存都是认为是不同的sql因为他们的hash值会不同。 5.对于Innodb事务会让缓存失效当事务内的语句更改了表即使Innodb的多版本机制隐藏了事务的变化服务器也会使所有不管事务内还是外引用了该表的查询缓存的哦偶失效直到事务提交所以经常使用事务或使 缓存的命中率下降。所以有些场景下Query Cache 不仅不能提高效率反而可能造成负面影响。从缓存中受益最大的查询是需要很多资源产生得到的结果并且变化不是很频繁的。7.Query cache带来的额外开销1.sql优化器在分析之前必须检查缓存 2.如果查询是可以缓存但是不在缓存中那么产生结果后进行保存会带来额外开销 3.写入数据的查询也会带来而外开销因为他必须去检查缓存中是否有相关sql如果有得让它失效。8.确认系统的Query Cache 的使用情况命中率show status like Qcache% ; Qcache_free_blocks目前还处于空闲状态的 Query Cache 中内存 Block 数目 Qcache_free_memory目前还处于空闲状态的 Query Cache 内存总量 Qcache_hitsQuery Cache 命中次数 Qcache_inserts向Query Cache 中插入新的 Query Cache 的次数也就是没有命中的次数 Qcache_lowmem_prunesQuery Cache 因为内存不够而从中删除老的Query Cache的次数。 Qcache_not_cached没有被 Cache 的 SQL 数包括无法被 Cache 的 SQL 以及由于 query_cache_type 设置的不会被 Cache 的 SQL Qcache_queries_in_cache目前在 Query Cache 中的 SQL 数量 Qcache_total_blocksQuery Cache 中总的 Block 数量 Query Cache 命中率 Qcache_hits/Qcache_hitsQcache_inserts Query Cache 的大小设置一般不要超过256MB。 如果从查询缓存中返回一个查询结果服务器把Qcache_hits状态变量的值加一而不是Com_select变量。9.未命中缓存的情况 1.查询不可缓存比如包含不确定函数比如current_date等。 2.结果太大超过了query_cache_limit的大小。 3.由于内存空间不够被移除了。10.MySQL Cluster 和 Query Cache MYSQL 文档中说明确实可以在 MySQL Cluster 中使用 Query Cache。这块还需要继续研究。11.内存与碎片1.首先缓存自身大小为40K。mysql服务器自己管理自己的内存不依赖于操作系统。 2.服务器每次分配一个块至少是query_cache_min_res_unit的大小但它不能精确的分配服务器不是在获得所有结果才返回给客户的而是产生一行就发送一行因为这样的效率高但结果是缓存的结果不精确。 3.flush query cache 移除缓存碎片它会把所有的存储块向上移动把空闲块移动到底部但它运行的时候会阻塞访问查询缓存锁定整个服务器。该语句不从缓存中移出任何查询。12.Query cache的限制1.5.1.17之前的版本不能缓存cache绑定变量的query从5.1.17开始支持。 2.Procedure、function、Trigger、临时表 、用户有某个表的列级权限的query不能被缓存。 3.包含很多每次执行结果都不一样的系统函数不能被缓存比如current_date()。如果你想让他缓存比如缓存今天的可以把current_date()的实际值赋予它。 4.mysql5.1之前的准备语句也不能被缓存prepared statement。 5.mysql, INFORMATION_SCHEMA相关表的查询也不会被缓存。12.其他相关SELECT查询的总数量等价于Com_select Qcache_hits queries with errors found by parserCom_select的值等价于Qcache_inserts Qcache_not_cached queries with errors found during columns/rights check 转载于:https://blog.51cto.com/xqtesting/1376090