MySQLデータベースのSQL文の最適化方法

1433 ワード

1、show statusを使って各種SQLの実行頻度を了解するmysql> show status like 'Com%';このコマンドは、sqlコマンドの実行回数を問い合わせることができる.
2、位置決め実行効率の低いSQL文
実行効率の低いSQLを特定するには、一般的に2つの方法があります.
  • は、遅いクエリーログの位置決め効率の低いSQLを通じて、--log-show-queries[=file_name]でこのオプションを起動します.
  • スロークエリーログはクエリー終了後に記録されるため、アプリケーションの実行効率に問題が発生した場合、スロークエリーログは問題を特定できない.この場合、show processlistコマンドを使用して、現在のMySQLが実行しているスレッドを表示することができる.スレッドの状態、ロックテーブルの有無など、SQLの実行状況をリアルタイムで表示することができ、同時にいくつかのロックテーブルの操作を最適化することができる.

  • 3、explainで非効率SQLの実行計画を分析する
    all < index < range < ref < eq_ref < const, system < null
    上記の一般的なアクセスタイプは、左から右にかけて、パフォーマンスが低下しています.
  • ALL:全表スキャン、MySQLは全表を遍歴して行をマッチングする;
  • index:インデックススキャン、MySQLはインデックス全体を巡って一致するローをクエリーします.
  • range:インデックス範囲スキャン、、>=、betweenなどのオペレータによく見られる.
  • ref:非一意インデックススキャンまたは一意インデックスのプレフィックススキャンを使用して、個別の値に一致するレコード行を返します.
  • eq_ref:refと同様に、使用するインデックスが一意のインデックスであることを区別し、インデックスキー値ごとにテーブルにレコードが1つしか一致しない.簡単に言えば、マルチテーブル接続でprimary keyまたはunique indexを関連条件として使用することである.
  • const/system:単一テーブルに最大1つの一致行があり、クエリが非常に迅速であるため、この一致行の他の列の値は、オプティマイザによって現在のクエリで定数として処理され、例えば、プライマリ・キーprimary keyまたは一意インデックスunique indexに基づいてクエリされる.
  • NULL:MySQLはテーブルやインデックスにアクセスせず、直接結果を得ることができます.

  • 4、MySQL 4.1の拡張命令explain extendedMySQL 4.1にexplain extendedコマンドが導入され、show warningsを加えることで、SQLが実際に実行する前にオプティマイザがどのSQLを書き換えたかを得ることができます.