あなたは今までそのような経験を持っていた、自分のSQLの実行は半日を実行し、他の人のSQLポイントは、結果が出てくる、それは本当に他人の運ですか?一度大丈夫、毎回幸運ですが、とにかく、私は信じていません。結局のところ、技術的な人々が食べるために強さに基づいています。
次のリレーショナル・データベースmysqlを例として、SQLの高速化を分析します。データベースの性質上、SQLの最適化は2つのことを中心に行われます:
インデックスを使った最適化手法は
1、どこのインデックスの後に、substr、連結、長さ、数学関数など、関数の使用は、クエリのインデックスに行っている可能性が大幅にクエリ時間を増加させるフルテーブルスキャンになります。もしwhere条件で関数を使用する必要がある場合は、フィルタの値を使用して、たとえば、対処するための所望の方法を達成することができます:
2、ここで、インデックスの列がある場合は、フィルタの背後にある複数の列の使用は、インデックスの列は、順序の背後にある列の順序は、インデックスの列と一致している必要があります複数の列である場合、インデックスの列は、どこの後ろに配置する必要があります、またはインデックスに移動されません。
3、書き込みの後ろに、この書き込みは全くインデックスに行くつもりはありません。このような場合、2つの選択肢があります:
a. テーブルが1つの場合、EXISTSまたはNOT EXISTSを使用できます。
b, 複数テーブルの結合であれば、left joinやjoinなどを柔軟に使用して、is nullやis not nullの効果を得ることができます。
注意: テーブルがヌル値のデフォルト値で設計されている場合、ここでヌル値を扱う方がはるかに簡単です。
4、操作の使用を避けるために、必要に応じて、交換するuoionすべてまたはユニオンの使用をお勧めします。など:
また、列挙値が制限されている場合などにも使用できます:
5、ここで、操作の使用を避けるために、ないでの使用は完全にインデックスを避けるために、テーブル全体をスキャンする必要があります、SQLの実行時間の大幅な増加は、存在または存在しないの使用を交換することをお勧めします。これは、存在または存在しない置換する使用をお勧めします:
7、演算子の使用を避けようとすると、そのような演算子もインデックスを無駄にします。この種の演算は、一般に他の多段階演算に変換することができます。
8、ファジーマッチの先頭に%の使用を避けるために、同じを使用する場合は、再びインデックスに行くことはありません。このような:
データ量削減のための最適化手法
1、操作を使用しないようにしよう、明確な非常にリソースを消費し、インデックスに移動されません、もし明確な操作を使用する必要があります、そのような代替によってグループ化を使用することをお勧めします:
2、データの条件を事前にフィルタリングする必要はありません、主にマルチテーブルの結合のために、その後、各テーブルの優先順位は、フィルタリング操作ではなく、再び統一されたフィルタに参加します。など:
3は、すべてのユニオンは、重複データをフィルタリングするため、ユニオンデータの重複が非常に高い場合は、すべてのユニオンの使用が大幅にIOの時間を減らすことができますデータの量を減らす必要がある場合は、クエリの速度を向上させます。
4は、操作の使用を避けるため、*は、ディスクIOを増加させる、すべてのデータクエリアウトされ、すべての列を必要としない場合は、列の独自の必要性のうちだけを選択するのが最善です。
5、クエリがあまりにも多くのレベルに入れ子になっている場合、いくつかの一時的な結果セットのデータ量の真ん中が大きすぎる簡単にメモリのオーバーフローを引き起こす、あるいはエラーを報告します。この時点で、それは最初の真ん中に置くことをお勧めし、一時テーブルを使用して後者のクエリ操作を行うことができます。