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 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

クエリ キャッシュを使用して MySQL のパフォーマンスを最適化する方法 クエリ キャッシュを使用して MySQL のパフォーマンスを最適化する方法 May 11, 2023 pm 05:51 PM

MySQL は一般的に使用されるリレーショナル データベースの 1 つであり、アプリケーションでは高可用性とパフォーマンスが重要です。クエリ キャッシュは MySQL の重要なパフォーマンス最適化戦略であり、無効なデータベース クエリを回避し、クエリの効率を向上させることができます。この記事では、クエリ キャッシュを通じて MySQL のパフォーマンスを最適化する方法を紹介します。 1. クエリキャッシュとは何ですか?クエリ キャッシュとは、MySQL の SELECT ステートメントの結果をキャッシュすることで、同じ SELECT ステートメントが要求された場合、データをクエリすることなく結果がキャッシュから直接取得されます。

MySQL クエリ キャッシュを使用してパフォーマンスを向上させる MySQL クエリ キャッシュを使用してパフォーマンスを向上させる May 11, 2023 am 08:31 AM

データ量とアクセスの増加に伴い、データベースのパフォーマンスの問題が多くの Web サイトのボトルネックになっています。多くの場合、データベース クエリは、Web サイト上で最もリソースを大量に消費する操作の 1 つです。オープンソースのリレーショナル データベース管理システムとして、MySQL は多くの Web サイトで選ばれるデータベースになっています。 MySQL では、クエリ キャッシュはクエリのパフォーマンスを大幅に向上させるキャッシュ メカニズムです。この記事では、MySQL クエリ キャッシュの仕組みを紹介し、MySQL クエリ キャッシュをより効果的に使用するための実践的な提案をいくつか提供します。

PHP データベース クエリ最適化のヒント: 検索エクスペリエンスの向上 PHP データベース クエリ最適化のヒント: 検索エクスペリエンスの向上 Sep 18, 2023 pm 04:34 PM

PHP データベース クエリ最適化スキル: 検索エクスペリエンスを向上させる 概要: この記事では、開発者が実際のプロジェクトで検索エクスペリエンスを向上させるのに役立つ、PHP データベース クエリ最適化スキルをいくつか紹介します。これには、インデックスの使用、データベース構造の適切な設計、効率的なクエリ ステートメントの作成における最適化方法が含まれており、具体的なコード例が示されています。はじめに: Web アプリケーション開発において、データベース操作は避けられないリンクの 1 つです。クエリ操作は、データベース、特に検索機能で頻繁に発生する操作の 1 つです。したがって、データベース クエリを最適化しても、

PHP データベースの検索パフォーマンスを向上させる 5 つのテクニック PHP データベースの検索パフォーマンスを向上させる 5 つのテクニック Sep 18, 2023 pm 02:07 PM

PHP データベース検索パフォーマンスを向上させる 5 つのテクニック 要約: Web アプリケーションの継続的な開発に伴い、データベース検索パフォーマンスは開発者が注意を払う必要がある重要な問題になっています。データベース検索に PHP を使用する場合、いくつかの効果的なテクニックを使用してパフォーマンスを向上させることができます。この記事では、PHP データベースの検索パフォーマンスを向上させる 5 つのテクニックを紹介し、具体的なコード例を示します。インデックスの使用 データベースにインデックスを追加すると、検索パフォーマンスが大幅に向上します。インデックスを使用すると、データベース クエリが高速化され、データ スキャン時間が短縮されます。頻繁に検索する場合

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 は、多くの Web サイトやアプリケーションで広く使用されている、人気のあるオープン ソース データベース管理システムです。重要なパフォーマンス向上メカニズムの 1 つはクエリ キャッシュです。クエリ キャッシュは、MySQL が SELECT ステートメントの結果セットをキャッシュするために使用するメカニズムです。クエリがキャッシュされると、MySQL は結果セットをメモリに保存し、同じクエリが再度リクエストされたときに、クエリを再度実行するのではなく、キャッシュされた結果を返します。理想的な状況では、クエリ キャッシュによりクエリのパフォーマンスが大幅に向上します。ただし、正しく構成されていない場合は、

Hibernate フレームワークではクエリ キャッシュはどのように機能しますか? Hibernate フレームワークではクエリ キャッシュはどのように機能しますか? Apr 17, 2024 pm 10:12 PM

Hibernate フレームワークのクエリ キャッシュ機能は、クエリ結果をキャッシュすることでクエリのパフォーマンスを向上させ、クエリの繰り返し実行を回避できます。その動作原理は、セッション レベルとグローバル レベルを含む 2 レベルのキャッシュであり、キャッシュは @Cacheable アノテーションによって有効になります。キャッシュされたデータは、明示的にクリアされるか期限切れになるまで、すべてのセッションで共有できます。キャッシュを明示的にクリアするメソッドには、session.clear() または session.evict() が含まれます。クエリ結果が変更されると、透過的なクリアが自動的に実行されます。

See all articles