MySQLはクエリをキャッシュしますか?


19

MySQLデータベースとPHP Data Objects(PDO)を接続し、広範なSQLクエリを実行しています。通常、約1500ミリ秒かかります。まだ最適化する必要があります。PHPスクリプトを短い間隔で2回実行すると、クエリにかかる時間は約90ミリ秒です。クエリはどちらの場合も同じです。同じクエリでスクリプトを実行すると、しばらくしてから再び1500ミリ秒かかります。

何故ですか?データベースは自動的にキャッシュされますか?データベースがキャッシュを保存してから自動的に削除する時間はありますか?

これは2つの異なるスレッドで発生するため、PHPで結果をキャッシュできないと思います。データベースが変更されたかどうかを知ることができないため、PHPが結果をキャッシュするとは思わないでしょう。

データベースに新しい行を挿入するスクリプトを毎分実行しています。これは、しばらくして再び1500ミリ秒かかる理由でもあります。関連するテーブルが同じではなくなったため、キャッシュは削除されていました。


コードを見せてください。私はあなたのクエリを必要としません、あなたはそれをどのようにテストしていますか。

3
はい、mySQLはクエリをキャッシュします。それはそのような賢いです。

@Kasyxどんなコード?これは基本的なPDOですが、PHPスクリプトを2回実行し、1つのスクリプトでクエリを2回実行しないため、PHPがキャッシュできるとは思いません。また、pdoを質問に実際には関係ないのに編集した理由を説明できますか?

3
すべてのDBMSには、何らかのページレベルのキャッシュがあります。多くの場合、クエリ実行プランまたはクエリ結果(MySQLを含む)をキャッシュすることでそれを超えています。この最後のことが、観察された行動の主な原因であると思われます。
ブランコディミトリエビッチ

あなたは毎分挿入をしていますか?最初に整理てください!
グラントトーマス

回答:


15

これはおそらくMySQL Query Cacheのアーティファクトです。

SQLクエリを実行すると、MySQLは結果をキャッシュし、高速であれば次の実行をキャッシュします。クエリが参照するテーブルにデータを挿入するスクリプトを実行すると、結果キャッシュが無効になり、クエリを次回「実際に」実行する必要があります。

上記リンクのMySQLドキュメントから:

ほぼ完全に固定されたSELECTステートメントのセットで構成されるクエリミックスは、頻繁にINSERTステートメントがキャッシュ内の結果を継続的に無効化するミックスよりも、キャッシュを有効にすることでメリットが得られます。


5

はい、mySQL(他のすべての一般的なデータベース製品と共通)は、作成されたクエリをキャッシュします。

キャッシングは非常に巧妙です。クエリの正確なパラメータが同じでなくても、クエリにキャッシュを使用することがよくあります。これはパフォーマンスに大きな違いをもたらす可能性があります。

キャッシュは、DBサーバーソフトウェア内で完全に制御されます。キャッシュに含まれるものの可視性も、特定のアイテムがキャッシュに残っている期間もありません。他のクエリが呼び出されているかどうかなどに応じて、いつでも上書きされる可能性があります。パフォーマンスを向上させるためにありますが、パフォーマンスに依存するべきではありません。

詳細については、MySQLマニュアルを参照しください

さらに、PDOを使用すると、クエリを「準備済みステートメント」として記述し、プレーンテキストのクエリ文字列にハードコーディングするのではなく、パラメータをバインドできます。これは、DBサーバー上でのキャッシュの意味も持ち、繰り返されるクエリに対してもパフォーマンスが向上します。


2
「MySQL 5.1.17の時点で、クエリキャッシュは、セクション8.6.3.1「クエリキャッシュの動作」で説明されている条件の下でプリペアドステートメントに使用されます。5.1.17より前は、クエリキャッシュはプリペアドステートメントに使用されません。 dev.mysql.com/doc/refman/5.1/en/query-cache.html

1
他のすべての一般的なデータベース製品と共通」:それは少し誤解を招くです。MySQLのようにクエリ結果をアクティブにキャッシュするDBMSはほとんどありません。DBMSは通常、クエリ結果ではなく、テーブル(またはインデックス)データのみをキャッシュします。それらのほとんどは、クエリ実行計画(およびクエリ「ソース」)
-a_horse_with_no_nameを

3
「クエリの正確なパラメータが同じでなくても、クエリにキャッシュを使用できることがよくあります」というのは完全に間違っています。クエリは、キャッシュから提供されるために、以前に実行され、まだキャッシュされたクエリとバイト単位で同一である必要があります。との間の違いでさえ、他の点SELECT *select *は同一のクエリはキャッシュから提供されません。 dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html。一貫性のために5.1リンクを掲載しましたが、すべてのバージョンに適用されます。
マイケル-sqlbot
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.