首頁 資料庫 mysql教程 mysql的查询缓存说明

mysql的查询缓存说明

Jun 07, 2016 pm 05:55 PM
查詢快取

mysql的Query Cache有其特殊的业务场景,也不像其他数据库产品,缓存查询语句的执行计划等信息,而是直接缓存查询语句的记录集和对应的SQL语句

对mysql查询缓存从五个角度进行详细的分析:Query Cache的工作原理、如何配置、如何维护、如何判断查询缓存的性能、适合的业务场景分析。

工作原理

查询缓存的工作原理,基本上可以概括为:
缓存SELECT操作或预处理查询(注释:5.1.17开始支持)的结果集和SQL语句;
新的SELECT语句或预处理查询语句,先去查询缓存,判断是否存在可用的记录集,判断标准:与缓存的SQL语句,是否完全一样,区分大小写;

查询缓存对什么样的查询语句,无法缓存其记录集,大致有以下几类:
查询语句中加了SQL_NO_CACHE参数;
查询语句中含有获得值的函数,包涵自定义函数,如:CURDATE()、GET_LOCK()、RAND()、CONVERT_TZ等;
对系统数据库的查询:mysql、information_schema
查询语句中使用SESSION级别变量或存储过程中的局部变量;
查询语句中使用了LOCK IN SHARE MODE、FOR UPDATE的语句
查询语句中类似SELECT …INTO 导出数据的语句;
事务隔离级别为:Serializable情况下,所有查询语句都不能缓存;
对临时表的查询操作;
存在警告信息的查询语句;
不涉及任何表或视图的查询语句;
某用户只有列级别权限的查询语句;

查询缓存的优缺点:

不需要对SQL语句做任何解析和执行,当然语法解析必须通过在先,直接从Query Cache中获得查询结果;
查询缓存的判断规则,不够智能,也即提高了查询缓存的使用门槛,降低其效率;
Query Cache的起用,会增加检查和清理Query Cache中记录集的开销,而且存在SQL语句缓存的表,每一张表都只有一个对应的全局锁;

配置

是否启用mysql查询缓存,可以通过2个参数:query_cache_type和query_cache_size,其中任何一个参数设置为0都意味着关闭查询缓存功能,但是正确的设置推荐query_cache_type=0。

query_cache_type
值域为:0 -– 不启用查询缓存;
值域为:1 -– 启用查询缓存,只要符合查询缓存的要求,客户端的查询语句和记录集斗可以
缓存起来,共其他客户端使用;
值域为:2 -– 启用查询缓存,只要查询语句中添加了参数:sql_cache,且符合查询缓存的要求,客户端的查询语句和记录集,则可以缓存起来,共其他客户端使用;

query_cache_size
允许设置query_cache_size的值最小为40K,对于最大值则可以几乎认为无限制,实际生产环境的应用经验告诉我们,该值并不是越大, 查询缓存的命中率就越高,也不是对服务器负载下降贡献大,反而可能抵消其带来的好处,甚至增加服务器的负载,至于该如何设置,下面的章节讲述,推荐设置 为:64M;

query_cache_limit
限制查询缓存区最大能缓存的查询记录集,可以避免一个大的查询记录集占去大量的内存区域,而且往往小查询记录集是最有效的缓存记录集,默认设置为1M,建议修改为16k~1024k之间的值域,不过最重要的是根据自己应用的实际情况进行分析、预估来设置;

query_cache_min_res_unit
设置查询缓存分配内存的最小单位,要适当地设置此参数,可以做到为减少内存块的申请和分配次数,但是设置过大可能导致内存碎片数值上升。默认值为4K,建议设置为1k~16K

query_cache_wlock_invalidate
该参数主要涉及MyISAM引擎,若一个客户端对某表加了写锁,其他客户端发起的查询请求,且查询语句有对应的查询缓存记录,是否允许直接读取查询缓存的记录集信息,还是等待写锁的释放。默认设置为0,也即允许;

维护

查询缓区的碎片整理

查询缓存使用一段时间之后,一般都会出现内存碎片,为此需要监控相关状态值,并且定期进行内存碎片的整理,碎片整理的操作语句:FLUSH QUERY CACHE;

清空查询缓存的数据
那些操作操作可能触发查询缓存,把所有缓存的信息清空,以避免触发或需要的时候,知道如何做,二类可触发查询缓存数据全部清空的命令:
(1).RESET QUERY CACHE;
(2).FLUSH TABLES;

性能监控

碎片率
查询缓存内存碎片率=Qcache_free_blocks / Qcache_total_blocks * 100%

命中率
查询缓存命中率=(Qcache_hits – Qcache_inserts) / Qcache_hits * 100%

内存使用率
查询缓存内存使用率=(query_cache_size – Qcache_free_memory) / query_cache_size * 100%

Qcache_lowmem_prunes
该参数值对于检测查询缓存区的内存大小设置是否,有非常关键性的作用,其代表的意义为:查询缓存去因内存不足而不得不从查询缓存区删除的查询缓存信息,删除算法为LRU;
query_cache_min_res_unit

内存块分配的最小单元非常重要,设置过大可能增加内存碎片的概率发生,太小又可能增加内存分配的消耗,为此在系统平稳运行一个阶段性后,可参考公式的计算值:
查询缓存最小内存块 = (query_cache_size – Qcache_free_memory) / Qcache_queries_in_cache
query_cache_size

我们如何判断query_cache_size是否设置过小,依然也只有先预设置一个值,推荐为:32M~128M之间的区域,待系统平稳运行一个时间段(至少1周),并且观察这周内的相关状态值:
(1).Qcache_lowmem_prunes;
(2).命中率;
(3).内存使用率;

若整个平稳运行期监控获得的信息,为命中率高于80%,内存使用率超过80%,并且Qcache_lowmem_prunes的值不停地增加,而且增加的数值还较大,则说明我们为查询缓冲区分配的内存过小,可以适当地增加查询缓存区的内存大小;

若是整个平稳运行期监控获得的信息,为命中率低于40%,Qcache_lowmem_prunes的值也保持一个平稳状态,则说明我们的查询缓冲区的内 存设置过大,或者说业务场景重复执行一样查询语句的概率低,同时若还监测到一定量的freeing items,那么必须考虑把查询缓存的内存条小,甚至关闭查询缓存功能;

业务场景

通过上述的知识梳理和分析,我们至少知道查询缓存的以下几点:
查询缓存能够加速已经存在缓存的查询语句的速度,可以不用重新解析和执行而获得正确得记录集;
查询缓存中涉及的表,每一个表对象都有一个属于自己的全局性质的锁;
表若是做DDL、FLUSH TABLES 等类似操作,触发相关表的查询缓存信息清空;
表对象的DML操作,必须优先判断是否需要清理相关查询缓存的记录信息,将不可避免地出现锁等待事件;
查询缓存的内存分配问题,不可避免地产生一些内存碎片;
查询缓存对是否是一样的查询语句,要求非常苛刻,而且还不智能;

我们再重新回到本节的重点上,查询缓存适合什么样的业务场景呢?只要是清楚了查询缓存的上述优缺点,就不难罗列出来,业务场景要求:
整个系统以读为主的业务,比如门户型、新闻类、报表型、论坛等网站;
查询语句操作的表对象,非频繁地进行DML操作,可以使用query_cache_type=2模式,然后SQL语句加SQL_CACHE参数指定;

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何透過查詢快取來優化MySQL效能 如何透過查詢快取來優化MySQL效能 May 11, 2023 pm 05:51 PM

MySQL是常用的關聯式資料庫之一,在應用程式中的高可用性和高效能至關重要。查詢快取是MySQL中一個重要的效能最佳化策略,透過它可以避免無效的資料庫查詢,提高查詢效率。本文將介紹如何透過查詢快取來優化MySQL效能。一、什麼是查詢快取?查詢快取就是快取MySQL中SELECT語句的結果,當有相同的SELECT語句請求時,直接從快取中取得結果,而不需要再去查詢數據

透過使用MySQL查詢快取提高效能 透過使用MySQL查詢快取提高效能 May 11, 2023 am 08:31 AM

随着数据量的增加和访问量的增加,数据库的性能问题已经成为很多网站的瓶颈。在许多情况下,数据库查询是网站中最耗费资源的操作之一。MySQL作为一种开源的关系型数据库管理系统,已经成为许多网站的首选数据库。在MySQL中,查询缓存是一种可以显著提高查询性能的缓存机制。本文将介绍MySQL查询缓存的工作原理,并提供一些实用建议,可以帮助您更好地使用MySQL查询缓

PHP資料庫查詢最佳化技巧:提升搜尋體驗 PHP資料庫查詢最佳化技巧:提升搜尋體驗 Sep 18, 2023 pm 04:34 PM

PHP資料庫查詢最佳化技巧:提升搜尋體驗摘要:本文將介紹一些PHP資料庫查詢最佳化技巧,協助開發人員在實際專案中提升搜尋體驗。包括使用索引、合理設計資料庫結構、寫出高效的查詢語句等方面的最佳化方法,並提供具體的程式碼範例。引言:在Web應用開發中,資料庫操作是不可避免的環節之一。而查詢操作是資料庫中頻繁發生的操作之一,尤其在搜尋功能中。因此,對資料庫查詢進行最佳化,不

提升PHP資料庫搜尋效能的五種技術 提升PHP資料庫搜尋效能的五種技術 Sep 18, 2023 pm 02:07 PM

提升PHP資料庫搜尋效能的五種技術摘要:隨著Web應用程式的不斷發展,資料庫搜尋效能成為了開發者需要關注的重要議題。在使用PHP進行資料庫搜尋時,我們可以使用一些有效的技術來提升效能。本文將介紹五種提升PHP資料庫搜尋效能的技術,並提供具體的程式碼範例。使用索引在資料庫中新增索引可以大大提高搜尋效能。索引可以加快資料庫的查詢速度,減少資料掃描的時間。對於頻繁搜

如何實現MySQL底層最佳化:查詢快取的使用與效能分析 如何實現MySQL底層最佳化:查詢快取的使用與效能分析 Nov 08, 2023 pm 07:35 PM

如何實現MySQL底層最佳化:查詢快取的使用和效能分析MySQL是一種常用的關聯式資料庫管理系統,在大數據量的場景下,最佳化資料庫效能是非常重要的。其中,查詢快取是一個可以幫助提高MySQL效能的重要元件。本文將介紹如何使用查詢快取以及如何進行效能分析,並提供具體的程式碼範例。查詢快取的作用查詢快取是一種將查詢結果快取起來的機制,當有相同的查詢被執行時,MySQL

如何實現MySQL底層最佳化:查詢快取的進階使用與效能分析 如何實現MySQL底層最佳化:查詢快取的進階使用與效能分析 Nov 08, 2023 pm 08:49 PM

如何實現MySQL底層最佳化:查詢快取的進階使用與效能分析摘要:MySQL是一款廣泛使用的關聯式資料庫管理系統,它的查詢快取功能可以有效提升查詢效能。本文將介紹MySQL查詢快取的進階使用方法和效能分析,包括查詢快取的啟用、使用查詢快取實例、查詢快取失效的原因和解決辦法等,同時給出具體的程式碼範例幫助讀者更好地理解和實踐。關鍵字:MySQL,查詢緩存,最佳化,效能

如何透過優化MySQL查詢快取來提高效能 如何透過優化MySQL查詢快取來提高效能 May 11, 2023 am 08:16 AM

MySQL是一個流行的開源資料庫管理系統,在許多網站和應用程式中都被廣泛使用。其中一個重要的效能提升機制就是查詢快取。查詢快取是MySQL用來快取SELECT語句的結果集的機制。當一個查詢被快取時,MySQL將在記憶體中儲存結果集,並在同一個查詢再次被請求時傳回快取結果,而不是再次執行查詢。在理想情況下,查詢快取可以大幅提高查詢效能。然而,如果沒有正確地配置

Hibernate 框架中查詢快取如何運作? Hibernate 框架中查詢快取如何運作? Apr 17, 2024 pm 10:12 PM

Hibernate框架中的查詢快取功能可提升查詢效能,透過快取查詢結果避免重複執行查詢。其工作原理為兩級緩存,包括Session級和全域級,並透過@Cacheable註解啟用快取。快取的資料可被所有Session共享,直到明確清除或過期。明確清除快取的方法包括session.clear()或session.evict(),透明清除則在查詢結果變更時自動執行。

See all articles