、SQL文の最適化
効率の問題を監視するSQLに対するMySQLスロークエリログを使用します。
//スロークエリログを開くかどうかを確認し
「slow_query_log」のようなショーの変数を、
//スロークエリログ保管場所の確認
「slow_query_log_file」のようなショーの変数を、
//はスロークエリログをオン
に=グローバルslow_query_logを設定します。
//スロークエリログの保存場所の指定
グローバルshow_query_log_file = 'の/ var /設定のlib / mysqlの/ホームステッド- slow.logを';
//レコードはインデックスSQLを使用しない
= ON SETグローバルlog_queries_not_using_indexesを。
1Sは、SQLよりも多くの//クエリレコード
SETを、株式会社フリーはlong_query_time = 1に参加し、
スロークエリログには以下が含まれます。
#ユーザ@ホスト:ルート[ルート ] @localhost [] // のホスト情報SQL実行
#Query_time:0.0000024 Lock_time:0.00 Rows_sent: 0 Rows_esamined:0 // SQLの実行情報の
設定されたタイムスタンプ= 1402389324 // SQLの実行時間を
選択*店舗から; // SQLの内容
公式のMySQLのスロークエリログ解析ツールmysqldumpslow:
使用法:
//パラメータのリストを確認してください
-h mysqldumpslow
最初の3比較的遅いSQLの中に//スロークエリログ解析
3 /var/lib/mysql/homestead-slow.log -t mysqldumpslow |ほか
//出力スタイルが影響
0.00sの0.00s =行= 10.0はロック:カウント:. 1時間
ルートは[RPPT] @localhost
StoreからSELECT *を
MySQLのスロークエリログ解析ツールPT-クエリダイジェスト(より詳細でmysqldumpslowより包括的な結果):
ファイルへの出力//
スローログをPT-クエリダイジェスト > slow_log.report
//データテーブルへ
のPt-クエリダイジェストslow.log -review \
H = 127.0.0.1、D =テストは、Pは、Uがルート=ルート、P = 3306 =、T = query_review \
--create-reviewtable \
- -review履歴トン= hostname_slow
使用法:
//パラメータのリストを確認
--help PT-クエリはダイジェストを
最初の3比較的遅いSQLの中に//スロークエリログ解析
/var/lib/mysql/homestead-slow.log PT-クエリダイジェスト|ほか
//出力三つの部分
のログの表示時間範囲、および合計数と異なるSQL SQLの数に加えて1
2.Response時間:応答時間課金コール:SQL実行頻度
3.sql特定のログ
スロークエリログにより、次のような問題があり、問題のあるSQLを見つけました:
1.はより頻繁に照会し、SQLクエリが長く占有するたびに
最初のいくつかのクエリは、通常、PT-クエリ・ダイジェストとして分析されています
2.IO大きなSQL(IOレベルでのデータベースの主要なボトルネック)
注行項目の検討分析をPT-クエリはダイジェスト
3.ミスインデックスSQLの
注意行は、比較分析を検査し、行は、PT-クエリ・ダイジェストを送信します。
SQLクエリと分析実施計画を説明することで
選択CUSTOMER_ID ,, FIRST_NAME、LAST_NAMEから説明を顧客に。
MAX()とcount()の最適化:
MAX()関数を最適化する - //最後の給与期間を照会
支払いから選択最大(PAYMENT_DATE)を説明。
支払い(payment_data)のインデックスを作成idx_paydate ; // インデックスが(インデックスをカバー)PAYMENT_DATEします
// SQLの数の映画で2006年と2007年に同時に見つける - count()関数を最適化
SELECT COUNT(RELEASE_YEAR = '2006' またはヌル)として '2006、映画館の数'、映画からの '映画の2007年間数' として(RELEASE_YEAR = '2007' またはnull)を数えます。
カウント()説明:
サブクエリの最適化:
通常の状況下で、我々は、クエリに参加するクエリオプティマイザを処理する必要がありますが、キー対多の関係にあっ関連しているかどうかに注意を払うように最適化する際に、データを複製するために注意を払います。(個別デエンファシス)
//クエリサンドラ主演のすべての映画
フィルムからの選択、タイトル、RELEASE_YEAR、LENGTHを説明
(中どこをfilm_id
(中film_actor ACTOR_IDからfilm_id選択
俳優FIRST_NAME =「サンドラ」))からACTOR_ID選択します。
最適化によるグループ
一時テーブルの前に//変更
sakila.film_actorから選択actor.first_name、actor_last_name、COUNT(*)を説明
インナーが使用してsakila.actorに参加(ACTOR_ID)
film_actor.actor_idによるグループ。
//サブインデックスクエリの組み合わせを変更
sakila.film_actorから選択actor.first_name、actor.last_name、c.cntを説明
内部結合(
(ACTOR_ID)を用いC)として、ACTOR_ID選択ACTOR_IDによってsakila.film_actor群からCNTとして(*)カウント。
制限の最適化
時間のほとんどは、このFilesorts使用されるように、一般的にIOの問題の多くが発生します、頻繁に使用するorder by句を伴って、ページング処理で使用される制限。
//ソートファイル、IO大きいです
選択film_id、タイトル制限50,5によってsakila.film注文から説明を説明します。
1.最適化:(film_id順)操作によって主キー列または順序を使用して索引付け
2.次のクエリで主キーフィルターとの最後の主キーのレコードの戻り値は、データ・レコードの過度のスキャン大量のを避けるために、
ここfilm_id限界1,5によってfilm_if> 55とfilm_id <= 60順番film_id、sakila.filmから説明を選択します。
ページのより多くの、より大きなIO
//最後の給与期間を照会- MAX()関数を最適化するために、EXPLAIN SELECT マックス(PAYMENT_DATEを)から支払い、作成したインデックスidx_paydateをON 支払い(payment_data);(インデックスをカバー)//インデックスは、SQLで同時に見つける// PAYMENT_DATEします2006年と2007年の映画の数-最適化カウント()関数SELECT COUNT (RELEASE_YEAR = '2006' またはヌル)AS '2006年、映画の数' 、COUNT (RELEASE_YEAR = '2007' またはヌル)AS 2007」、映画の数" からのフィルム; //関連count()関数https://blog.csdn.net/wendychiang1991/article/details/70909958/