SQLが遅い理由

遅い読み取り操作

ほとんどのプロジェクトでは、データベースには書き込み操作よりも多くの読み取り操作があるため、最初に読み取り操作が遅い理由について説明します。
遅いSQLを見つける方法
MySQLには遅いクエリログがあります。これはデフォルトで閉じられており、手動で開く必要があります。
1.低速ログが有効になっているかどうかを照会します

mysql> show variables like '%slow_query_log%';

OFFは閉じていますONは開いています
2.遅いクエリログを開きます

mysql> set global slow_query_log='ON';

この方法は現在のデータベースに対してのみ有効であり、MySQLの再起動後に無効になります。永続的に有効にする場合は、構成ファイルmy.cnfを変更する必要があります。3
。低速クエリログ
my.cnfを永続的に開いて[mysqld]を見つけ、その下に次のコードを追加します。

slow_query_log=ON
slow_query_log_file=/usr/local/mysql/var/localhost-slow.log
long_query_time=5
log-queries-not-using-indexes = 1

設定が完了したら、MySQLサービスを再起動する必要があります。
関連パラメータの説明を
1.slow_query_log
この設定項目はスローログクエリ機能を有効にするかどうかを判断し、設定された値がONかOFFである。
2.slow_query_log_file
この設定項目はスローログクエリですレコードファイルであり、手動で作成する必要があり
ます。3。Long_query_time
この構成項目は、低速ログクエリの時間しきい値を設定します。このしきい値を超えると、低速ログが記録されます。構成値は0です(すべてのsqlステートメントが記録されます)。 、または> 0(特定のしきい値))。構成項目は秒単位であり、10進数に設定できます
。4.log-queries-not-using-indexes
この構成項目は、SQLの
読み取り操作の理由を記録するためのものです。インデックスに使用されていないステートメントは低速
です。1。欠落しているインデックス
は、実行されるSQLの前にexplainを追加することにより、現在のSQLの実行計画を分析できます。
ここに画像の説明を挿入
1.タイプ

MySQLがテーブル内の必要な行を見つける方法を表します。一般的に使用されるタイプは、ALL、index、range、ref、eq_ref、const、system、NULLです。これらのタイプは左から右に向かって、パフォーマンスが徐々に向上します。

ALL:Mysqlはテーブル全体をトラバースして、一致する行を見つけます。

index:ALLとの違いは、インデックスタイプがインデックスツリーのみをトラバースすることです。

range:指定された範囲内の行のみを取得し、インデックスを使用して行を選択します。

ref:上記の表の接続一致条件を示します。インデックス列の値を見つけるために使用される列または定数。

eq_ref:refと同様に、違いはそれが一意のインデックスであるかどうかです。インデックスキーの値ごとに、一致するレコードはテーブルに1つだけあります。簡単に言えば、主キーまたは一意のキーがマルチテーブル接続の関連付け条件として使用されます。

const、system:Mysqlがクエリの特定の部分を最適化し、それを定数に変換するときは、これらのタイプのアクセスを使用します。whereリストに主キーを置くと、Mysqlはクエリを定数に変換できます。systemはconstタイプの特殊なケースであり、クエリテーブルに行が1つしかない場合は、systemを使用します。

NULL:Mysqlは最適化プロセス中にステートメントを分解し、実行中にテーブルやインデックスにアクセスする必要もありません。たとえば、インデックス列から最小値を選択するには、別のインデックス検索を使用できます。

2.possible_keys

クエリで使用できるインデックス(ただし、必ずしも使用されるとは限りません。インデックスがない場合はNULLとして表示されます)。

3.キー

実際に使用されたインデックス。

4.行

対応するレコードを見つけるために必要な行数を見積もります。

5.追加

より一般的なものは次のとおりです。

インデックスの使用:カバーするインデックスが使用され、テーブルに戻る必要がないことを示します。

whereの使用:テーブル内のすべての情報を読み取らずに、必要なデータはインデックスを介してのみ取得できます。これは、テーブルの要求されたすべての列が同じインデックスの一部である場合に発生します。つまり、mysqlサーバーは次の行を取得します。その後、ストレージエンジンフィルター。

一時的な使用:MySQLが結果セットを格納するために一時テーブルを使用する必要があることを示します。これは、クエリの並べ替えとグループ化、一般的なgroup by、orderbyで一般的です。

filesortの使用:クエリにorder by操作が含まれていて、インデックスを使用して完了できない並べ替え操作が「ファイル並べ替え」と呼ばれる場合。

2.ダーティページの問題
メモリデータページがディスクデータページと矛盾している場合、メモリデータページはダーティページと呼ばれます。
データを読み書きするたびにディスクにアクセスするときのIOオーバーヘッドの増加を回避するために、Innodbストレージエンジンは、対応するデータページとインデックスページをメモリのバッファープールにロードすることにより、読み取りと書き込みの速度を向上させます。次に、キャッシュされたデータをバッファプールに保持するために最も最近使用されなかった原則に従います。読み込むデータページがメモリにない場合は、バッファプール内のデータページを申請する必要がありますが、バッファプール内のデータページは確実です。データページが上限に達したら、保存する必要があります。最長の未使用データ。ページはメモリから削除されます。ただし、ダーティページが削除された場合は、ダーティページをディスクにフラッシュして再利用する必要があります。
ダーティページをフラッシュする状況では、ダーティページの割合を制御する必要があり、75%に近づかないようにする必要があります。同時に、REDOログのディスク書き込み速度も制御し、innodb_io_capacityパラメーターを設定してInnoDBにディスク容量を通知する必要があります。

書き込み動作が遅い

1.ダーティページのフラッシュ
書き込み操作中に、ストレージエンジン(Innodb)がレコードをREDOログ(ストレージ物理ログ)に書き込み、キャッシュを更新して、更新操作が完了します。後続の操作ストレージエンジンは、必要に応じて操作レコードをディスクに同期します。REDOログの書き込みプロセスはディスクに順次書き込まれます。ディスクの順次書き込みはシークなどの時間を短縮し、ランダム書き込みよりもはるかに高速であるため(Kafkaストレージの原則と同様)、REDOログの書き込み速度は非常に高速です。速い。同時実行性の高いシナリオでは、REDOログはすぐにいっぱいになりますが、データが遅すぎてディスクに同期できません。このとき、ダーティページが生成され、後続の書き込み操作がブロックされます。SQLの実行は当然遅くなります。ダウン。

2.
Mysqlをロックします。特定のSQLによって変更される行がロックされた場合、後続の操作はロックが解除された後にのみ実行できます。
現在のロック状況を表示します。

SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

トランザクションの待機時間が長すぎるか、デッドロックが発生した場合は、「kill thread ID(trx_mysql_thread_id)」によって現在のロックを解放できます。

おすすめ

転載: blog.csdn.net/weixin_43278644/article/details/112697819