• 售前

  • 售后

热门帖子
入门百科

mysql select缓存机制使用详解

[复制链接]
哲911 显示全部楼层 发表于 2021-10-26 13:10:56 |阅读模式 打印 上一主题 下一主题
mysql Query Cache 默以为打开。从某种程度可以进步查询的效果,但是未必是最优的办理方案,如果有的大量的修改和查询时,由于修改造成的cache失效,会给服务器造成很大的开销,可以通过query_cache_type【0(OFF)1(ON)2(DEMAND)】来控制缓存的开关.

必要留意的是mysql query cache 是对巨细写敏感的,由于Query Cache 在内存中是以 HASH 布局来举行映射,HASH 算法基础就是构成 SQL 语句的字符,以是 任何sql语句的改变重新cache,这也是项目开发中要建立sql语句誊写规范的缘故原由吧

1. 何时cache

a) mysql query cache内容为 select 的效果集, cache 利用完备的 sql 字符串做 key, 并区分巨细写,空格等。即两个sql必须完全划一才会导致cache掷中。

b) prepared statement永久不会cache到效果,纵然参数完全一样。听说在 5.1 之后会得到改善。

c) where条件中如包含了某些函数永久不会被cache, 比如current_date, now等。

d) date 之类的函数如果返回是以小时或天级别的,最好先算出来再传进去。
select * from foo where date1=current_date -- 不会被 cache
select * from foo where date1='2008-12-30' -- 被cache, 精确的做法

e) 太大的result set不会被cache (< query_cache_limit)

2. 何时invalidate

a) 一旦表数据举行任何一行的修改,基于该表干系cache立即全部失效。

b) 为什么不做智慧一点判断修改的是否cache的内容?由于分析cache内容太复杂,服务器必要寻求最大的性能。

3. 性能

a) cache 未必全部场所总是会改善性能

当有大量的查询和大量的修改时,cache机制大概会造成性能下降。由于每次修改会导致体系去做cache失效操作,造成不小开销。

别的体系cache的访问由一个单一的全局锁来控制,这时间大量>的查询将被壅闭,直至锁开释。以是不要简朴以为设置cache肯定会带来性能提升。

b) 大result set不会被cache的开销

太大的result set不会被cache, 但mysql预先不知道result set的长度,以是只能比及reset set在cache添加到临界值 query_cache_limit 之后才会简朴的把这个cache 丢弃。这并不是一个高效的操作。如果mysql status中Qcache_not_cached太大的话, 则可对潜在的大效果集的sql显式添加 SQL_NO_CACHE 的控制。
query_cache_min_res_unit = (query_cache_size – Qcache_free_memory) / Qcache_queries_in_cache

4. 内存池利用

mysql query cache 利用内存池技术,自己管理内存开释和分配,而不是通过操作体系。内存池利用的根本单元是变长的block, 一个result set的cache通过链表把这些block串起来。由于存放result set的时间并不知道这个resultset终极有多大。block最短长度为 query_cache_min_res_unit, resultset 的末了一个block会实行trim操作。

Query Cache 在进步数据库性能方面具有非常重要的作用。

其设定也非常简朴,仅必要在设置文件写入两行: query_cache_type 和 query_cache _size,而且 MySQL 的 query cache 非常快!而且一旦掷中,就直接发送给客户端,节省大量的 CPU 时间。
固然,非 SELECT 语句对缓冲是有影响的,它们大概使缓冲中的数据过期。一个 UPDATE 语句引起的部分表修改,将导致对该表全部的缓冲数据失效,这是 MySQL 为了平衡性能而没有接纳的步伐。由于,如果每次 UPDATE 必要查抄修改的数据,然后撤出部分缓冲将导致代码的复杂度增长。

query_cache_type 0 代表倒霉用缓冲, 1 代表利用缓冲,2 代表根据必要利用。

设置 1 代表缓冲永久有效,如果不必要缓冲,就必要利用如下语句:

代码如下
  1. SELECT SQL_NO_CACHE * FROM my_table WHERE ...
复制代码
如果设置为 2 ,必要开启缓冲,可以用如下语句:

代码如下
  1. SELECT SQL_CACHE * FROM my_table WHERE ...
复制代码
用 SHOW STATUS 可以检察缓冲的情况:

代码如下
  1. mysql> show status like 'Qca%';
  2. +-------------------------+----------+
  3. | Variable_name | Value |
  4. +-------------------------+----------+
  5. | Qcache_queries_in_cache | 8 |
  6. | Qcache_inserts | 545875 |
  7. | Qcache_hits | 83951 |
  8. | Qcache_lowmem_prunes | 0 |
  9. | Qcache_not_cached | 2343256 |
  10. | Qcache_free_memory | 33508248 |
  11. | Qcache_free_blocks | 1 |
  12. | Qcache_total_blocks | 18 |
  13. +-------------------------+----------+
  14. 8 rows in set (0.00 sec)
复制代码
如果必要盘算掷中率,必要知道服务器实行了多少 SELECT 语句:

代码如下
  1. mysql> show status like 'Com_sel%';
  2. +---------------+---------+
  3. | Variable_name | Value |
  4. +---------------+---------+
  5. | Com_select | 2889628 |
  6. +---------------+---------+
  7. 1 row in set (0.01 sec)
复制代码
在本例中, MySQL 掷中了 2,889,628 条查询中的 83,951 条,而且 INSERT 语句只有 545,875 条。因此,它们两者的和和280万的总查询相比有很大差距,因此,我们知道本例利用的缓冲范例是 2 。

而在范例是 1 的例子中, Qcache_hits 的数值会远宏大于 Com_select
以上就是本文的全部内容,渴望对大家的学习有所帮助,也渴望大家多多支持草根技术分享。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作