MySQLの最適化対策

1、クエリの最適化、全表スキャンを回避しようとしてください、あなたは最初の場所と順番に関与列でインデックス作成を検討すべきです。
2は、それ以外の場合はエンジンがインデックスと全表スキャンを使用して放棄する、句!=または<>オペレータでは避けるべきです。
図3は、ヌル値に避けるべきである、WHERE句内のフィールドと判定され、エンジンがインデックスとフルテーブルスキャンを使用して放棄する原因となる
ような:numがあるTからIDを選択ヌル
を保証するために、0 NUMのデフォルト値を提供することができます:NUMテーブル列の値は、その後、このクエリnullでない
T = 0ここからSELECT IDのNUM
。4、など、接続する句または状態が、エンジンがインデックスとフルテーブルスキャンを使用して放棄する原因となる場合には避けるべきです:
TからSELECT WHERE IDのNUM = NUM = 10か20がある
。このクエリできます。
SELECT IDのNUMからT = 10
、キックます組合は重量連合//すべての結果は、体重を再生されません
Tは、IDから= 20がNUMある場所を選択
5、以下。問い合わせはまた、全表スキャンにつながる:などの名前ここで、tからIDを選択する 「%ABC%」は、 効率を改善するために、フルテキスト検索とみなすことができます。
SELECT * sbl_shop_orderのODからどこod.paymentTypeのような '%再%'

図6は、注意して使用せずに、されるべきではそれ以外の場合のような、フルテーブルスキャンにつながる:
上記からIDを述べにSELECT NUM T(2、3)WHERE
:連続値の間で使用することができない
SELECTは、上述したID Tから、および3 NUM BETWEEN。1
、。7 where句で使用されるパラメータは、フルテーブルスキャンにつながる場合。実行時にSQLがローカル変数のみを解決しますが、オプティマイザは、実行するアクセス・プランの選択を延期することはできませんので、それはコンパイル時に選択する必要があります。しかし、コンパイル時にアクセス・プランを確立する場合、変数の値が不明であるため、選択されたインデックスエントリとして使用することはできません。次の文は、フルテーブルスキャンを実行するよう:
SELECTを上記ID = @ NUM NUMは、ここでTから
インデックスを使用してクエリを強制的に変更することができる:
上記TからNUM NUMは= @(索引(インデックス名))IDを挙げるとSELECT
8、ここで避けるべきであるとエンジンがインデックスと全表スキャンを使用してあきらめてしまいますフィールドの操作、の発現句。例えば:
T / 2 = 100がどこからNUM IDを選択
読み込みする必要があります。
ここで、NUM = 100 *のT 2からSELECT IDを
。9、句エンジンは、インデックスを使用して放棄する原因となるフィールドに関数演算のために避けるべきです全表スキャン。例えば:
サブT WHERE(名前、1,3)= 'ABC'からSELECT ID - ABCで始まるID名
DATEDIFF(日、CREATEDATE、 '2005-11-30')は= 0ここで、tからIDを選択-的IDを生成'2005-11-30'を
应改为:
名'ABC%'などはTからIDを選択
IDを選択どこCREATEDATE> = '2005-11-30'とCREATEDATE < '2005年12月1日' Tから

10は、where句内の関数、算術演算、またはその他の表現をしないでください「=」左、またはシステムが適切に索引付け機能しない場合があります。
インデックスが複合インデックスであれば11は、インデックスフィールドを使用しての条件として、あなたはそれ以外の場合は、インデックスが使用されません、システムがインデックスを使用して確実にするための条件として、最初のフィールドにインデックスを使用し、すべきでなければなりませんそのフィールドの順序は、順序インデックスと一致しているので、可能な限り。
表などの12、すべてのインデックスが有効なクエリは、SQLクエリの最適化は、テーブル内のデータに基づいて行われるインデックスは、重複データの大規模な数を示したときに、SQLクエリはインデックスを使用して行っていないかもしれません、フィールドのセックスを持っている、男性、各女性のほぼ半分、インデックスも性別にクエリ効率には影響を建てなくても。
13は、インデックスが不可能である、対応するインデックスは確かに選択の効率を向上させることができますが、挿入または更新は、インデックスを再構築する時期が可能で、インデックスは慎重にどのように構築するために検討する必要があるため、また、挿入および更新の効率を低下させます場合であってもよいように。あまりにも多くのあなたはそれほど頻繁に必要に応じてインデックス列を構築するために使用されるのいくつかを検討する必要がある場合は、インデックス番号テーブルは、6よりも最善ではありません。
唯一のようにクエリとの接続のパフォーマンスが低下しますし、ストレージのオーバーヘッドが増加します文字、のために設計することがない場合は14、数値フィールド、情報を含む数値フィールドを使用しています。一度だけ文字列内の各文字を比較することにより、クエリとの接続1を処理し、数値の比較のために、エンジンが十分にあるためです。
15、小さな収納スペースのすべての可変長フィールドの最初のため、あなたは検索効率の比較的小さなフィールドで、クエリに続いて、ストレージスペースを節約することができ、代わりに、CHAR / NCHARのvarchar型/ NVARCHARの使用を可能な限りは明らかに高くなっています。
16は、どこにでも未満でフィールドのいずれかを返さない、代わりに「*」の分野の特定のリストで、Tから選択*を使用しないでください。
17は、代わりに一時テーブル変数テーブルを使用しています。テーブル変数は、大量のデータが含まれている場合は、インデックスが(主キーのみインデックス)非常に限られていることに注意してください。
資源の消費を減らすために頻繁に作成および削除一時テーブル、システムテーブルを避けるために18、。

おすすめ

転載: www.cnblogs.com/longyao/p/11730449.html