...

MySQLオプティマイザークエリホスティングにおける最適化

この記事では MySQL Optimiser Queryは、ホスティング環境においてより効果的な実行プランを構築し、計算時間を節約します。その中で重要な設定、クエリ設計、モニタリングに焦点を当てます。 ホスティング 直接的なロード時間の優位性をもたらす。.

中心点

記事の骨格となる重要な点は以下の通りである。.

  • オプティマイザー 理解する:コスト・ベースのプランニング、統計、ジョイン・シーケンス.
  • インデックス作成 マスター:正しいキー、複合インデックス、不可視インデックス。.
  • 書き直し を適用する:INの代わりにEXISTS、フィルタを早めに設定、必要な列のみ。.
  • 構成 を制御します:InnoDB バッファ、ログサイズ、I/O、CPU を適切に使用します。.
  • モニタリング 優先順位をつける:スロー・クエリ・ログ、EXPLAIN ANALYZE、一目でわかるメトリクス。.

ホスティングにおけるオプティマイザーの決定方法

が、そのようなことはないと思う。 オプティマイザー 可能なプランを評価し、クエリに最も適したパスを選択します。ここでは、カーディナリティ、インデックス、ジョインシーケンス、利用可能なリソースが考慮されます。 共有- またはVPSホスティングが直接レスポンスタイムを制御します。MySQL 8.0では、ヒストグラムとより良い統計により、カーディナリティをより確実に推定することができるようになりました。私は、プランナが信頼できる数値を見ることができるように、特に大きなデータ変更の後、ANALYZE TABLEで統計情報を意図的に更新しています。ホスティングの文脈では、これはピーク負荷が発生する前にそれを防ぐのに役立ちます。.

統計、カーディナリティ、安定した推定値

推定値が実際の実行時間とどの程度一致しているかを観察する。EXPLAIN ANALYZEから得られる行やフィルタ比率が実際と大きく乖離している場合は、テーブル統計が古いか、分布が不等であるかをチェックする。Zipf分布またはSkew分布を持つ列については、選択性が正しく評価されるようにヒストグラムを保存します。特に大量の挿入や削除を行った後のホットリード・テーブルでは、ANALYZE TABLEを使用します。永続的な統計により、オプティマイザが再起動後に推測で青くなることはありません。季節的なパターン(例えば月の変わり目)が見えたら、計画の変動やコールドスタートを避けるために、事前に更新をスケジュールする。.

非常に動的なワークロードの場合、私は実運用から計測を切り離します。代表的なデータステータスをステージングデータベースにミラーリングし、そこでEXPLAIN ANALYZEを計測します。動作が正しければ、本番での計画が安定したままである可能性が高い。間違ったプランに繰り返し遭遇する場合、私は一時的なオプティマイザヒントを使用しますが、永続的な依存関係がないように、その理由と設定期間を明確に文書化します。.

ホスティングに有効なインデックス戦略

頼りにしているのは コンポジット-典型的なWHEREやJOIN条件に沿ったインデックスを作成し、不要な重複を避ける。インデックスが多すぎると書き込み操作のたびにコストがかかるので、どのキーが実際にヒットするかを定期的にチェックしています。私はMySQL 8.0の不可視インデックスを使って、削除せずに実運用で効果をテストするのが好きです。実際には、まずインデックス候補を使用し、次に使用せずにワークロードを実行し、レイテンシとハンドラ数を比較します。リスクとメリットについてもっと深く掘り下げたい方は データベースのインデックス それ以上のキーが生産的なテーブルに移動する前に。.

クエリーの書き換え:計画から実際のスピードへ

交換する イン-EXISTSを使用することで、相関関係を回避し、検索パスを短縮することができる。さらに、オプティマイザがより小さな中間セットを移動させ、結合コストを削減できるように、できるだけ早い段階でフィルターをかける。広い行はメモリとI/Oの消費量を大幅に増加させるので、本当に必要な列だけをフェッチする。インデックスが使用されないようにするため、インデックス付き列の関数は使用しない。このようにして、オプティマイザを、より少ないデータページに触れるプランに誘導し、ホスティングのレスポンスタイムを大幅に向上させます。.

結合アルゴリズム、述語プッシュダウン、メモリ近接

MySQLは主にネストされたループの変種を使用し、次のような利点があることを知っている。 バッチキーアクセス(BKA) そして マルチレンジ・リード(MRR), もしそれらがデータ状況にマッチすれば。これらのテクニックは、ルックアップをバンドルし、データページをより順次に読み込むことで、I/Oを削減する。. インデックス・コンディション・プッシュダウン(ICP) インデックス内のフィルタをチェックすることで、テーブルに戻る不要なジャンプを減らします。私はEXPLAIN/ANALYZEでこれらの最適化が有効かどうかを認識し、インデックスやフィルタシーケンスを調整してプッシュダウンシナリオを作成します。.

派生テーブルとビューについては コンディション・プッシュダウン が部分集合で可能かどうか、あるいは実体化が高すぎるかどうかである。結合の幅が広くなる場合は、OR チェーンを次のように置き換える。 ユニオン・オール 適切なインデックスを使用することで、より良いMRR/ICPパスをプランナに導くことができます。このようにして、データアクセスをキャッシュフレンドリーに保ち、ストレージとCPUの負荷を軽減しています。.

ホスティングにおけるInnoDBの設定チューニング

を使っている。 innodb_buffer_pool_size 実際にはRAMを50-70%程度にして、頻繁な読み込みがメモリから直接来るようにしている。書き込みワークロードについては、フラッシュが詰まらないように、innodb_log_file_sizeとチェックポイントの比率に注意を払う。小規模なデータベースが多数あるノードでは、やみくもにバッファプールをスケールするのではなく、ページヒット率、ダーティページ、I/O待ち時間を監視しています。CPUのコミットメントは多くの場合、不利な計画やインデックスの欠落が原因なので、コアを追加する前にまず計測します。こうすることで、ボトルネックを的確にシフトさせ、CPUの使用率を維持することができる。 レイテンシー プロジェクトが変わっても、その負荷は低い。.

一時的なテーブル、並べ替え、ページネーションが苦にならない

すぐにディスクに切り替わるので、内部テンポラリ・テーブルは最小限にする。GROUP BY、DISTINCT、および大きなORDER BYをチェックして、適切なインデックスがすでに目的の順序を提供しているかどうかを確認する。上位N個のセットだけが必要な場合は ORDER BY をもって リミット ワイド・ソートを使う代わりに、適切なインデックスを使用します。ページネーションでは、高いオフセットは避け、„Seek “ページネーション(例えば、WHERE id > last_id ORDER BY id)を使用することで、オプティマイザをO(N+Offset)パスではなくO(N)パスに導く。.

集計のカラムは狭く保ち、ソートのTEXT/BLOBはすぐにディスク上の負荷につながるので避けている。内部テンポラリテーブルが避けられない場合は、サイズを監視し、典型的な負荷ピークに対して十分なメモリ制限があることを確認する。安定したレスポンスタイムのためには、ホットクエリがディスクの一時停止を必要としないことが重要である。.

モニタリング、スロークエリログ、EXPLAIN ANALYZE

を起動させる。 遅い クエリログに適切な閾値を設定し、インデックスのないクエリだけでなく、多くのRows_examinedを持つクエリもログに記録します。次に、EXPLAINとEXPLAIN ANALYZEを使用して、個々の計画ステップの実際の実行時間を確認し、最大のコストブロックを認識します。再現性のある結果を得るために、同一のデータ状態でテストを行い、競合するcronジョブのような干渉の原因を切り分けます。私の 遅いクエリログ, これは有効化から評価へとつながる。これにより、インデックス作成、書き換え、設定のどれがそれぞれのクエリに最大の効果をもたらすかを知ることができる。.

トランザクション、ロック、分離が一目でわかる

レイテンシがプランではなくロックに起因するものかどうかを分析する。イノDB REPEATABLE READ は堅実だが、レンジスキャンには問題がある。 ギャップロック を生成する。競合する書き込みが活発なときは、セカンダリーインデックスでの対象外の範囲検索を避け、インデックスを介してアクセスパスをより正確に制御する。トランザクションは小さく短時間にし、ロックがすぐに解放されるようにしている。大量の変更については、バッチで作業し、以下のトレードオフを評価する。 innodb_flush_log_at_trx_commit そして sync_binlog を、望ましい耐久性という文脈で定義している。こうして私は、プランの最適化とロックのチューニングを明確に区別している。.

オプティマイザに役立つMySQL 8.0の機能

私はこうしている。 ヒストグラム 推定エラーを避けるために、カーディナリティが不均等に分布しているカラムに対してANALYZE TABLEを使用して更新します。JOIN_FIXED_ORDERのようなオプティマイザのヒントは、ヒューリスティックが間違っていて、測定後にそれを明確に証明できる場合にのみ使用します。CTEは私にとって可読性の高いクエリ設計を容易にしてくれますが、マテリアライゼーションが正しい選択なのか、インライン化が有効なのかをチェックします。アトミックDDLとInnoDB 8シリーズの改良は、長い中断のリスクを冒すことなく、負荷がかかった状態で変更を加えるのに役立っています。dev.mysql.comによると、パフォーマンス・スキーマにも利点がある。 指標 引っ張る。.

明細書作成、バッチ処理、バルク処理

私はこうしている。 準備されたステートメント パースのオーバーヘッドを削減し、プランの一貫性を保つために、繰り返しクエリに使用します。書き込み負荷については、インサートを複数行のステートメントに集約して インサート ... 重複キー更新時, コンフリクトが頻発する場合大規模なインポートには ロードデータ そして、チェックポイントとREDOログフラッシュが同期を保つように、管理可能なトランザクションにプロセスをカプセル化する。アプリケーション側では、コネクションが長続きするようにし、すべてのステートメントがコールドスタートで新しいセッションを生成しないようにする。このようにして、オプティマイザに安定した、よくパラメータ化されたワークロードを提供する。.

スケーリング:リード・レプリカ、シャーディング、キャッシング

配布する 読み物 個々のノードが高い読み込み負荷で汗をかき始めると、すぐにレプリカに書き込みます。ホットスポットが小さくなるように、クライアント別、地域別、時間別にシャーディングを行い、書き込み負荷を均等にします。クエリ・プロファイルが許す限り、クエリ・ベース・キャッシュ・システムに切り替えて、繰り返し結果がより早く利用できるようにする。レイテンシが重要なプロジェクトでは、TTLを短く設定し、インテリジェントに無効化することで、一貫性を保ち、キャッシュが利益を生むようにする。このようにして、オプティマイザーだけにすべての問題を補わせることなく、スケーリングパスを組み合わせている。 ハードウェア 高い。.

安定性、アップグレード、回帰防止を計画する

MySQLのアップグレードはスケジュールされたイベントとして扱う:新しいヒューリスティックは、クエリを高速化することもあるが、低速化することもある。バージョン変更の前に、代表的なEXPLAINとEXPLAIN-ANALYZEのスナップショットを保存し、クローン上で計測し、最もコストのかかるパスを比較します。早い段階でリグレッションの候補を見つける。私は意識的に 不可視インデックス と選択的 オプティマイザー 一時的な対策を講じる準備はできているが、逸脱はすべて文書化すること。その目的は、オプティマイザーに良好な統計とクリーンなスキームで仕事をさせることであり、永久に „強制 “することではない。.

アンチパターン:私が一貫して避けていること

を使うことはない。 セレクト * 不必要なカラムはメモリとネットワークをいっぱいにしてしまうからだ。WHEREのインデックス付きカラムでは、LOWER()のような関数はインデックスを消してしまうので使わない。オプティマイザがフィルタを使用するように、大きなORチェインをUNION ALLに分割し、適切なインデックスを使用する。大きなテーブルではORDER BY RAND()は使わない。ランダムなID、オフセット、あるいは事前に計算したセットを使う。また、クエリ内でJOINが多すぎないようにし、必要であれば、バッファリングされた 結果.

スキーマ設計の微調整:データ型、カバーリング・インデックス、生成カラム

データ型はできるだけ小さく、必要なだけ大きくする:もしカーディナリティが許すなら、BIGINTの代わりにINTを、そしてCHARは固定長のものだけを使う。こうすることで、より多くのキーがインデックス・ページに収まり、バッファ・プールが継続する。長いVARCHARフィールドの場合、私は 接頭辞インデックス また、照合順序を文書化し、比較が安定するようにする。クエリが数カラムしか読み込まない場合は、次のように計画します。 カバーリング指数, を使用することで、MySQL がそのテーブルにまったく触れる必要がなくなる。これにより、特に共有ホスティングでは、待ち時間が著しく短縮されます。.

計算された検索キー(正規化された電子メールや抽出されたJSON属性など)が必要な場合は、次のようにする。 生成された列 をインデックスとする。こうすることで、WHERE内の関数を避け、インデックス可能なアクセスを保つことができる。JSON/LOBフィールドが本当に読み取りパスにあるかどうかを定期的にチェックする。もしそうなら、重要な属性を型付けされた別のカラムにコア化する。最終的には、明確に型付けされた狭いスキーマでは、常にオプティマイザが勝利する。.

表:ホスティングシナリオに応じたチューニング対策

私は以下を利用しています。 概要, 日々のビジネスにおいて迅速な意思決定と優先順位の設定ができるようになります。対策は、共有、VPS、専用などの典型的なホスティングセットアップを対象としています。私はメリットと労力を評価し、投資した時間あたりのインパクトに基づいて決定を下します。この表は、レビューの際のチェックリストとして、また開発チームとのディスカッションの基礎として使用している。このようにして、私は定期的なチューニング・ステップを自分の プロセス.

チューニング対策 直接利益 こんな人に向いている 練習からの注意事項
innodb_buffer_pool_size ディスクの読み取り回数が減る VPS/専用 50-70%のRAMにセットし、ヒットレートをチェックする。
目に見えない指標 リスクのないテスト 製造 削除する前に効果をシミュレートする
EXPLAIN ANALYZE 現実的な計画期間 すべての 高価なステップに集中
クエリーの書き換え 少量の中間量 共有/VPS EXISTS、サブセット、WHEREに関数なし
レプリカを読む スケーラブル・リード VPS/専用 ポジションと一貫性をきれいに追跡
OPTIMIZE TABLE (InnoDB) 断片化の減少 計画的メンテナンス 測定とメンテナンス・ウィンドウの後のみ

練習のワークフロー:測定からクリーンプランまで

私は毎回、次のようにチューニングを始める。 見本市, クエリログを遅くし、ピークを特定し、メトリクスを保存します。次に、EXPLAIN ANALYZEを読み、Rows_examined、フィルター効果、結合戦略を調べ、最もコストのかかるエッジを記録します。そして具体的な対策を練ります:インデックスの追加や調整、クエリの書き換え、コンフィギュレーションの調整、そしてA/B測定。測定で利益が出た場合は、その変更を実施し、実際のトラフィック時間帯でのフォローアップ測定を計画します。良い計画を立てているにもかかわらずレスポンスが鈍いようであれば、ホスト以外の可能性のある原因をチェックし、以下のような手がかりをもとに作業します。 高いデータベース遅延, 設計ミスを見つけるために。.

オプティマイザ・トレースとEXPLAIN JSONの的を絞った使用

トリッキーなケースには オプティマイザー・トレース そして、どの代替案が却下されたのか、なぜ却下されたのかを読む。これにより、コストの仮定(例:選択性)やインデックスの欠落が、不利な決定につながったかどうかがわかる。JSON形式のEXPLAINは、„cost_info“、„used_key_parts“、テンポラリテーブルとファイルロケーションのフラグなどの追加フィールドを与えてくれる。これらの出力を変更前と変更後で比較し、コスト・パスが改善されたことを示す。日々の概要については、ステートメント・ダイジェストから要約したメトリクスも使用して、早期に異常値を特定し、クエリ・パターンごとに対策を講じるようにしています。.

ワードプレスとアプリのホスティング:日常生活における仕様

でスイッチを入れる。 ワードプレス アプリのキャッシュ、セッションデータがデータベース内で大きくならないようにすること、トランジェントを短く保つこと。広いJSONフィールドは集計を遅くするので、1行に多くのオプションを格納するプラグインを特にチェックしています。私はInnoDBに切り替え、一貫してオートインクリメントのPKを使用し、非常にアクティブなプロジェクトではリード・レプリカ・ネットワークを検討する。ショップやAPIのワークロードでは、最も一般的なフィルターやソート可能なカラムに沿った細かいインデックスに注意を払う。こうすることで、レスポンスタイムを目に見えて短くすることができる。 スケーリング はやりすぎだ。.

簡単にまとめると

を使うと、ホスティングで強い効果が得られるんだ。 MySQL きれいなスキーマ、優れたインデックス、明確なクエリを持つオプティマイザークエリ。統計は常に新鮮に保ち、EXPLAIN ANALYZEで計画をチェックし、すべての変更を測定する。コンフィギュレーションは役に立つが、しっかりとしたクエリ戦略と整頓されたデータモデルの代わりにはならない。負荷が増大するところでは、リードレプリカ、キャッシュ、シャーディングをうまく使って、リザーブを残します。こうして、ホスティングのセットアップを確実にスピードアップし ロード時間 コントロール下にある。.

現在の記事

マルチテナント・サーバー・アーキテクチャとテナント分離を備えた最新のデータセンター
クラウドコンピューティング

マルチテナント・アーキテクチャ:最新のSaaSホスティング・ソリューションの基本

マルチテナント・アーキテクチャと最新のSaaSホスティング・ソリューションのすべてを学びましょう。シングルテナントシステムとの違いを理解し、コスト効率と最適化されたクライアント分離のメリットを享受してください。.

ホスティング環境におけるサーバーCPUアフィニティの最適化
サーバーと仮想マシン

サーバーCPUアフィニティ:ホスティング運用の最適化

Server CPU Affinityはプロセスの固定化とチューニングによりホスティングパフォーマンスを最適化します。より少ないレイテンシ、より高いスループット - 実践的なヒント。.