MySQLにおける遅いSQLの最適化の方向性について詳しく話しましょう

MySQLにおける遅いSQLの最適化の方向性について詳しく話しましょう

序文

システムの実行速度に影響を与える要因は多数あります。フロントエンド、バックエンド、データベース、ミドルウェア、サーバー、ネットワークなど、多面的であり、偶発的な場合もあります。問題を正確に特定するには、システムについてある程度理解し、独自の判断に基づいて問題の範囲を絞り込む必要があります。

今日は、他の最適化については触れませんが、データベースの最適化に焦点を当て、いくつかの最適化の方向性について説明します。

システムの最適化の方向性と同様に、データベースの最適化も多面的であり、SQL ステートメントの実行、データベース自体の状況などをカバーします。次に、MySQL データベース内の遅い SQL ステートメントの最適化の方向性について説明し、いくつかの最適化のアイデアを提供したいと思います。

SQL文の最適化

SQL ステートメントの最適化に関する記事は数多くあり、SQL の記述に関するガイドも数多くありますが、それらは基本的な開発をサポートするだけです。問題をトラブルシューティングしたい場合は、SQL の記述だけに留まらず、問題を発見するための全体的なプロセスが必要です。

今回の最適化の方向性は、遅いクエリSQLの発見、SQL実行プランの表示と解析、SQLの書き込みの最適化、インデックスの最適化など、いくつかの側面に大別されます。

遅いクエリSQLを記録する

MySQL でスロークエリ SQL をログに記録するには、MySQL の内部構成 (slow_query_log 構成) を使用します。

'%query%' のような show variables を使用すると、次の 3 つの関連する結果を照会できます。

長いクエリ時間 | 1.00000
slow_query_log | オフ
slow_query_log_file | /data/mysql/mysql_slow.log

これら 3 つのパラメータについて説明してください。

  • long_query_time: SQL クエリを低速クエリと区別するには、クエリ時間を指定する必要があります。この時間を超えるクエリは、低速クエリとして分類されます。このパラメータは時間範囲を設定するために使用されます。単位は秒で、小数点以下を設定できます。
  • slow_query_log: このパラメータは、スロー クエリ SQL のログ記録を有効または無効にするスイッチです。オンまたはオフの 2 つのオプションがあります。デフォルト値はオフです。したがって、スロー クエリ SQL のログ記録を有効にする場合は、手動で有効に設定する必要があることがわかります。
  • slow_query_log_file: スロークエリ SQL ログのファイル パス。自分で指定できます。

設定を変更する方法

方法は2つあります。

まず、my.ini または my.cnf ファイルを変更し、これら 3 つの構成を 1 つにまとめます。

2 番目: set 構文を使用して sqlplus で直接パラメータを変更しますが、mysql データベースを再起動すると無効になります。sql は次のとおりです。

グローバル long_query_time を 10 に設定します。

グローバル slow_query_log をオンに設定します。

グローバル slow_query_log_file を /data/mysql/mysql_slow.log に設定します。

この方法は再起動後に失敗するため、最初の方法を使用することをお勧めします。

スロークエリログを表示する

スロークエリログをクエリするにはどうすればよいでしょうか? 量が少ない場合は、ツールを使用する必要はなく、直接開くことができます。

量が多い場合は、mysqldumpslow ツールを使用してクエリを実行する方が便利です。

mysqldumpslow は、mysqld と同じタイプの実行スクリプトであり、コマンドラインで直接実行できます。具体的な使用方法は次のとおりです。

mysqldumpslow パラメータ:

-sは順序です
-----al 平均ロック時間
-----ar 平均リターン記録時間
-----平均クエリ時間(デフォルト)
-----c カウント
-----l ロック時間
-----r レコードを返す
-----t クエリ時間

-t、先頭、つまり先頭に何件のレコードが返されるか
-g、カスタム正規表現

たとえば、次のようになります。

mysqldumpslow -sr -t 5 /data/mysql/mysql_slow.log

最も多くのレコードを返す 5 つの低速クエリ SQL をクエリします。

後でテスト ライブラリを構築し、使用方法を詳しく説明する別の記事を書く予定です。

SQL実行プランの表示

実行プランを表示する キーワード: EXPLAIN

使い方

EXPLAIN SELECT * FROM TABLE_NAME を直接実行するだけです。

これについては、最初は簡単にお話ししようと思っていたのですが、長くなりすぎたので、次の記事に残しておきます。どうぞご了承ください。

SQL 書き込みの最適化

SQL の記述を最適化する方法はたくさんあります。ここではそのいくつかを整理しました。ご自身で確認して、不足している部分を補ってください。

  • クエリ ステートメントで使用される判定条件が等しい、より小さい、より大きいかどうかに関係なく、where の左側の条件クエリ フィールドでは関数や式を使用しないでください。
  • select * を直接使用せず、クエリを実行する必要がある特定のテーブル フィールドを使用します。select * は完全なテーブル スキャンを使用し、インデックスは使用しません。
  • WHERE 句内の列に対する NULL チェックを避けてください。
  • WHERE では != または <> 演算子を使用しないでください。
  • IN の代わりに BETWEEN AND を使用してください。
  • 一般的な検索条件のインデックスを作成する
  • InnoDB、MyISAM、MEMORY などの適切なストレージ エンジンを選択します。さまざまなシナリオで異なるストレージ エンジンを使用すると、より良い結果が得られます。
  • like %123% を使用するとインデックスは処理されませんが、like 123% を使用するとインデックスは処理されます。とても重要です! ! !
  • 適切なフィールド タイプを選択します。
  • フィールドを設計するときは、NOT NULL を使用するようにしてください。

なぜ遅い SQL を管理する必要があるのでしょうか?

データベースの観点から: 各 SQL 実行は一定量の I/O リソースを消費します。SQL 実行の速度によって、リソースが占有される時間の長さが決まります。合計リソースが 100 で、遅い SQL ステートメントが合計 1 分間に 30 のリソースを占有すると仮定します。そして、この 1 分間に他の SQL ステートメントに割り当てることができるリソースの合計量は 70 となり、サイクルが継続されます。すべてのリソースが割り当てられると、すべての新しい SQL ステートメントがキューに入れられます。

アプリケーションの観点から見ると、SQL 実行時間が長いと待機時間が発生し、OLTP アプリケーションでのユーザー エクスペリエンスが低下します。

ガバナンスの優先事項

  • マスターデータベース -> スレーブデータベース
    • 現在、データベースは基本的に読み取りと書き込みが分離されたアーキテクチャを採用しており、読み取りはスレーブ データベースで実行され、書き込みはマスター データベースで実行されます。
    • スレーブデータベースのデータはマスターデータベースからコピーされるため、マスターデータベースの待機時間が長くなると、スレーブデータベースとのレプリケーション遅延が増加します。
  • 実行時間の長いSQL文が最初に管理される
  • 同時実行性が高く、特定のテーブルへのアクセスが集中するタイプの SQL がある場合は、まずそれを管理する必要があります。

要約する

これはまだ完成には程遠いです。まだ多くの書き方のルールがあり、索引の確立についてはまだ議論されていません。皆さんが自分で本を読むための時間を残しておきます。皆さんが進歩することを願っています。

これで、MySQL の遅い SQL の最適化の方向性に関するこの記事は終了です。MySQL の遅い SQL の最適化の方向性に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • MySQL 選択最適化ソリューションに関する簡単な説明
  • MySQL の垂直テーブルを水平テーブルに変換する方法と最適化のチュートリアル
  • 数千万データを持つMySQLテーブルを最適化する実践記録
  • MySqlサブクエリINの実装と最適化
  • MySQLを素早く最適化する
  • MySQL データ挿入最適化メソッドconcurrent_insert
  • MySQL 最適化 query_cache_limit パラメータの説明
  • MySQL の最適化: 高品質の SQL 文を書く方法
  • MySQLクエリ最適化: 100万件のデータに対するテーブル最適化ソリューション
  • MYSQL の 10 の典型的な最適化ケースとシナリオ

<<:  JS 関数とコンストラクタを簡単に理解する

>>:  Struts2 ジャンプ後に CSS と JS が無効になる問題の解決策のアイデアと実装手順

推薦する

JavaScript イベント委任の原則

目次1. イベント委任とは何ですか? 2. イベント委任の原則3. イベント委託の役割1. イベント...

OpenLayersはポイントフィーチャーレイヤーの集約表示方法を実現します

目次1. はじめに2. ポイントフィーチャーレイヤーの集約3. 重合の特殊処理4. 重合の特殊処理 ...

MySQL 最適化 Zabbix パーティション最適化

zabbix を利用する上での最大のボトルネックはデータベースです。zabbix のデータストレージ...

Vue で jsx 構文を正しく使用する方法

目次序文仮想DOM仮想DOMとは仮想DOMの利点レンダリング関数とは何ですか? jsx Vue3 で...

MYSQL スロークエリとログの例の説明

1. はじめにスロークエリログを有効にすると、MySQL は指定された時間を超えるクエリステートメン...

vue3.0 プロジェクトを素早く構築するための手順を完了する

目次1. 3.0をより適切にサポートするには、vue/cliのバージョンが4.5.0以上であることを...

React プロジェクトにおける TypeScript の使用の概要

序文この記事では、TS の基本的な概念ではなく、プロジェクトで TypeScript (以下、TS ...

SpringBoot + Vue プロジェクトを Linux サーバーにデプロイするための詳細なチュートリアル

序文SpringBoot + Vueのフロントエンドとバックエンドを分離したプロジェクトをどのように...

Vue のプロダクション環境と開発環境を切り替えてフィルターを使用する方法

目次1. 本番環境と開発環境を切り替える最初の方法: .envファイルを設定する2番目の方法2. フ...

MySQL マスタースレーブレプリケーションスレッドの状態遷移に関する詳細な理解

序文MySQL マスター スレーブ レプリケーションの基本原理は、スレーブ データベースがマスター ...

vite を使用して vue3 アプリケーションを構築する方法

1. インストールヒント: 現在、VUE3.0 の公式翻訳ドキュメントはありません。しかし、すでに誰...

Docker View プロセス、メモリ、カップ消費量

Docker プロセス、メモリ、カップ消費量を表示dockerコンテナを起動し、dockerinsp...

CSS の position 属性の値に関する研究 (概要)

CSS の位​​置属性は要素の配置タイプを指定し、上、下、左、右を使用して要素を具体的に配置します...

ウェブデザインにおけるインタラクション: ページングの問題に関する簡単な説明

機能: 前のページまたは次のページにジャンプします。要素: ページングの基本要素は、前のページ + ...

Ubuntuが仮想マシンでインターネットに接続できない問題の解決策

インターネットに接続できない仮想マシンをセットアップするのは非常に面倒です。ここでは、Ubuntu ...