10 MySQLの間違ったインデックス
で MySQLのテーブルの複数のインデックスをサポートすることができ、いくつかのSQLがで使用されるインデックス指定されていませんmysqlの自分自身を決定するために、時にはMySQLの非常に遅い実行してその結果、間違ったインデックス。
例
CREATE TABLE `t10`( ` id`のint型(11)NOT NULL 、 `A`のint型(11)DEFAULTの NULL 、 'B'のint型(11)DEFAULTの NULL 、 PRIMARY KEY (` id`)、 KEY `A`を(` A`)、 KEY 'B'( 'B') )ENGINE = InnoDBは、
テーブルに挿入された 10ワット記録
プロセス
区切り記号;; 作成 手順のidata_t11() 開始 宣言私はint型を、 セット Iを= 1 。 しながら、式(I = < 100000はない) の挿入 に T10の値(I、I、I)。 セット iは= iは+ 1 。 エンド 間; エンド;; 区切り文字; idata_t11を呼び出します();
分析のSQL 文の
MySQLの> 10000と20000の間トンから選択*;
SESSION A |
SESSION B |
一貫性のあるスナップショットとの取引を開始。 |
|
|
トンから削除します。 idata_t11()を呼び出し |
|
T10 SELECT * FROMを説明どこ10000と20000の間で、 |
コミット; |
セッションBのクエリは、間T10 SELECT * FROM説明 ; 10000と20000は、すべて選択しないだろう、とクエリログを遅くすることができます
設定 long_query_time = 0 。 選択 * からトンどこの間に 10000 と 20000 ; / * Q1 * / セレクト * から T力指数(A)との間の10000 と20000。/ * Q2 * /
ロジック・オプティマイザ
選択インデックスは、オプティマイザが働いている、とオプティマイザは、インデックスの目的は、最適なプログラムの実装を見つけることです、選択し、最小限のコストでステートメントを実行します。
データベースにおいて、走査線の数は、価格の実装に影響を与える要因の一つであり、走査線の数より少ないが、あまり頻繁にディスク上のデータへのアクセスを意味し、消費 CPU 少ないリソースを。
もちろん、走査線の数は、オプティマイザが使用の組み合わせかどうかを判断するための唯一の基準ではない一時テーブルをするかどうか、仕分け決定するために、およびその他の要因。
走査線の数はどのように判断するのですか?
MySQLの私たちは声明を開始する前に実行され、かつ正確にこのレコードの条件を満たして知ることができない、レコードのみの統計情報の数に基づいて推定することができますどのくらいです。
この統計情報は、明らかに「識別」、異なる指標値「として知られているより高い識別指数、および異なる値の数の指標の指標である塩基、」ベース良く大きめ。
MySQLは統計的手法、統計的サンプリング時間をサンプリングし、のInnoDB デフォルトは選択 N個のデータのページを、これらのページに関する統計的に異なる値、平均値を取得し、インデックス内のページ数を乗じ、それはこの指標のベースとなっています。
行数を超える変更されたときように、データテーブルが連続して、インデックス統計が固定されていない、更新されます 1 / M の時間を、自動的に再実行する索引統計を開始します。
で mysqlの、インデックスの統計情報を格納するための2つの方法がありますが、パラメータができinnodb_stats_persitent
(システム127 @。0.0。1:3306)、[ テスト] > [表示する変数のような ' innodb_stats_persistent ' 。 + - ----------------------- + ------- + | 変数名 | バリュー| + - ----------------------- + ------- + | innodb_stats_persistent | ON | + - ----------------------- + ------- +
- に設定されているON 統計がメモリに保持され示す、デフォルトN = 20であり、M = 10
- に設定OFF 専用メモリに格納された統計情報を示す、デフォルトのN = 8 、M = 16
実際には、特定のステートメント、オプティマイザも決定するための唯一の入力インデックス統計は、この文の実装では、スキャンする行数です
統計情報は、使用正確ではないテーブルT10を分析します。
MySQLの>説明セレクト * から T (間の1 と1000年)と(B との間の50000 と100000)順序によって Bリミット1。
インデックスの選択と異常な取り扱い
一つの方法は、使用して力指数(t)は、インデックスを選択するように強制します。
第二の方法は、ということであるあなたが導くために声明を改正検討することができます mysqlのに我々の期待指数。
オプティマイザはインデックスを使用することを選択する前に、 bは、それがインデックス使用していることを信じているので、Bの回避順序を(bは、それ自体あなたがインデックス選択した場合、すでに注文し、指標であるBを、その後、ソート横断するだけで済みますする必要はありません)、そうであっても走査線の数であればより多くの、それは低コストと判断されます。
今使っ bで注文を、の要件に従ってB、ソートは、これら2つのインデックスの使用はソートするために必要とされることを意味するので、意思決定に影響を与える主な条件への走査線の数は、この時間は、選択したインデックスを。
もちろん、この変更は、一般的な最適化手法ではありませんが、この文の中にだけあるリミット1 行は、そのような合意の論理的な結果を変更できるように条件を満たさなければならない場合は、。
第三は、であるいくつかのシーン、私たちが選択するか、または誤用インデックスを削除するには、オプティマイザに提供するために、より適切なインデックスを作成することができます。