SQL判断

SQL判断

これは、問題があるかどうかを判断する2つのSQLの出現によって判断することができます。

 

システムレベルの表現

CPUの消費厳しいです

IOは深刻待ちます

ページの応答時間が長すぎます

このようタイムアウトエラーログなどのアプリケーション

あなたは、現在のシステムの状態を表示するsarコマンド、topコマンドを使用することができます。

 

ステータスはプロメテウス、Grafana観測システムや他の監視ツールがあります。(記事あなたは私の前で見ることができます興味のある)640?Wx_fmt = PNG

 

SQL文の表現

長いです

実行時間が長すぎます

全表スキャンからデータを取得します。

実施計画の行は、多くの費用

長いSQLをよく理解している、SQLは、読書の時間は確かに悪くなる長すぎる、との問題の頻度は確かに高くなります。次のようにさらに質問が、判定SQLの実行計画から開始する必要があり:? 640 wx_fmt = PNG

 

実施計画は、基本的には、これはSQLの「味」で決定することができる(9950400)ALL、行偉大=全表スキャンクエリの種類を行くことを教えてくれる。

 

SQLアクセスの問題

異なるデータベースは、現在主流のスロークエリSQLデータベースを取得するために、以下のツールを別の取得方法を持っています

 

MySQLの

 

スロークエリログ

テストツールLoadRunnerは

Perconaツールなど、同社のptqueryとして

オラクル

 

AWRレポート

このようLoadRunnerのようテストツール

関連する内部ビューV $、$ SESSION_WAITなど

GRID CONTROL監視ツール

データベースをアップドリーム

 

AWRレポート

このようLoadRunnerのようテストツール

DaMengのパフォーマンス監視ツール(DEM)

関連する内部ビューV $、$ SESSION_WAITなど

SQLのライティングスキル

SQLライタは、以下の一般的なヒントがあります:

 

•インデックスの使用の合理化

 

インデックスはあまりスロークエリ、インデックス、より広い空間、時に動的なインデックスを維持するために必要なCRUD文を実行し、選択高のパフォーマンスに影響を与える(重複した値以下)と頻繁にここで、B-treeインデックスを確立する必要性を挙げています。

 

一般的には結合列をインデックスを作成する必要があります。フルテキストインデックスクエリの効率を使用して、より複雑なドキュメントの種類を、クエリとDMLのパフォーマンスのバランスを取るためにインデックスを付け、注意を払うを非先頭列ベースのクエリにするとき、複合インデックスの作成

 

•利用代替UNION ALL UNION

 

効率は、複製を実行するときにUNIONが必要で、UNION ALL UNIONより高い; UNIONの必要性は、データをソートします

 

•書き込みが選択は避けてください*

 

あなたがコンクリートの列にSQLオプティマイザ*ターンを実行する必要がある場合には、各クエリは、テーブルに戻ってするには、インデックスをカバーして行くことはできません。

 

•フィールドインデックスの推奨事項を登録しよう

 

フィールドプラス一般的なインデックス、事前に登録しよう

 

•複雑なSQL文を避けてください

 

読みやすさを向上させる、回避確率スロークエリ、操作終了を処理する、短いクエリを複数に変換することができます。

 

•避け書き込み1 = 1

 

•ランドによって避け順()同様の文言

 

RAND()は、データ列を複数回走査させます

 

SQLの最適化

実施計画

完全なSQLの最適化は、最初の実行計画を読み取る必要があり、実行計画を最適化することができ、低効率を置いていることを教えてくれます。我々MYSQLたとえば、どのような実施計画はいを参照するには。(各データベースの実施計画は、あなたが自分自身についてを通知する必要があり、同じではありません)説明sql640?Wx_fmt = PNG

 

フィールドが説明しました

各操作識別子IDを順次操作するオブジェクトIDの値が大きいほど、同じであれば、実行順序上から下へ、最初に実行さを識別する、独立して行われます

クエリselect句の各タイプをSELECT_TYPE

オブジェクト名テーブルは、通常、テーブル名が、他のフォーマットを操作します

パーティションパーティション情報が一致する(非パーティションテーブルに対してNULLです)

タイプタイプ接続動作

possible_keysは、インデックスを使用する場合があります

インデックス(最も重要な列)キーオプティマイザ実際に最高から最悪に使用する接続タイプはCONST、eq_reg、REF、範囲、インデックスおよびALLです。「悪趣味」に登場し、現在のSQLを表しALLときに発生します

バイト単位でkey_lenにオプティマイザ選択されたインデックスキーの長さ

refは基準バンク操作対象オブジェクトを表す、基準オブジェクトが非NULLであります

行のクエリ数(InnoDBのため、この値が推定値である)タプルがスキャン実行しました

タプルの数の割合をろ過条件テーブルデータを濾過しました

追加情報追加の重要な実施計画は、この列がfilesortレコードを使用して表示されたときに、一時的な文字を使用したときに、我々は慎重でなければならないが、おそらく最適化SQL文に必要

次に、我々は、SQL最適化プロセスの最適化と最適化手法を説明するために、いくつかの実際の例を使用します。

 

最適化のケース

テーブル構造

 

CREATE TABLEを `A`

    `Id`あなた(11)NOT NULLAUTO_INCREMENT、

    `seller_id` BIGINT(20)デフォルトNULL、

    `seller_name` VARCHAR(100)文字セットUTF8 COLLATE utf8_bin DEFAULT NULL、

    `gmt_create` VARCHAR(30)デフォルトNULL、

    PRIMARY KEY( `id`)

);

TABLE 'B'のCREATE

    `Id`あなた(11)NOT NULLAUTO_INCREMENT、

    `seller_name` VARCHAR(100)デフォルトNULL、

    `user_id` VARCHAR(50)デフォルトNULL、

    `user_name` VARCHAR(100)デフォルトNULL、

    `sales` BIGINT(20)デフォルトNULL、

    `gmt_create` VARCHAR(30)デフォルトNULL、

    PRIMARY KEY( `id`)

);

CREATE TABLEを 'C'

    `Id`あなた(11)NOT NULLAUTO_INCREMENT、

    `user_id` VARCHAR(50)デフォルトNULL、

    `order_id` VARCHAR(100)デフォルトNULL、

    `state` BIGINT(20)デフォルトNULL、

    `gmt_create` VARCHAR(30)デフォルトNULL、

    PRIMARY KEY( `id`)

);

三つの相関テーブル、クエリ、ユーザーの10時間、現在時刻の前後の受注、および順序に基づいて昇順で作成された時、以下の特定のSQL

 

a.seller_idを選択し、

       a.seller_name、

       b.user_name、

       c.state

から、

     B、

     C

どこa.seller_name = b.seller_name

  そしてb.user_id = c.user_id

  そしてc.user_id = 17

  そして、a.gmt_create

    ( - 600 MINUTE NOW()、INTERVAL)DATE_ADD BETWEEN

    (NOW()、INTERVAL 600 MINUTE)AND DATE_ADD

a.gmt_createによってオーダー。

データの量を確認します  

 

640?wx_fmt = PNG

 

640のオリジナル実行時間?Wx_fmt = PNG

 

オリジナル実行計画640?Wx_fmt = PNG

 

予備的最適化のアイデア

 

SQL、テーブル構造を維持するタイプフィールドとの条件が一致して、テーブルは、USER_ID VARCHAR(50)タイプ、実際のSQLとint型であり、暗黙的な変換は、インデックスを追加することなく、存在します。テーブルにB、Cは、フィールドのintをUSER_ID。

b及びc関連テーブルのテーブルが存在するため、B及びインデックステーブルUSER_IDを作成cは

相関テーブルとテーブルBの存在によって、及びBは、インデックステーブルSELLER_NAMEを作成するためのフィールドであります

複合インデックスを使用すると、一時テーブルやソートを排除します

予備的最適化のSQL

 

ALTER表Bは `user_id` INT(10)は、デフォルトのNULLを変更します。

ALTERテーブルは `user_id` INT(10)は、デフォルトのNULLを修正C;

ALTERテーブルは `idx_user_id`(` user_id`)インデックスを追加℃;

ALTER表Bの追加インデックス `idx_user_id_sell_name`(` user_id`、 `seller_name`)。

ALTER TABLE追加インデックス `idx_sellname_gmt_sellid`(` gmt_create`、 `seller_name`、` seller_id`)。

実行時間の最適化の見直し後

 

640?wx_fmt = PNG

 

最適化プログラムの実施の見直し後640?Wx_fmt = PNG

 

ビューの警告情報640?Wx_fmt = PNG

 

ALTER TABLE aは「gmt_create」日時のDEFAULT NULLを変更する最適化を継続します。

 

ビューの実行時間

 

640?wx_fmt = PNG

 

実行計画を見る640?Wx_fmt = PNG

 

概要

 

実行計画を見る説明

アラームがある場合は、アラーム情報ショーの警告を表示。

SQLに関連するビューのテーブル構造とインデックス情報

実施計画によると、可能な最適化のポイントを考えて

インデックスを追加、最適化ポイントを実行することができるテーブル構造の変化に応じて、SQL書き換え

実行計画を表示した後、実行時間を最適化

最適化の効果が明らかでない場合には、

おすすめ

転載: www.cnblogs.com/jsbjxh/p/12242084.html