質問: 999 など、where句で使用されるフィールドがユーザーの指定により常に異なります。(999は任意の値です) order byに使用されるフィールド数は3です。 現状ではインデックスは張っていないため、かなり検索速度が遅いため、インデックスを張りたいのですが、どのような張り方がいいのかがわかりません。 このような場合、インデックスを張る方法として、どの方法が一番よいのでしょうか? 1.検索に使用される10つのフィールドに1つずつ張ればよい 2.検索に使用される10つのフィールドとソートに使用される3つのフィールドに1つずつ張ればよい 3.where句の組み合わせを全て考えて複合インデックスを張る必要がある。 4.その他 また、80フィールドのテーブルを適当に4つくらいに分けて、検索時に結合すれば早くなったりするものでしょうか?
回答: >実際に検索に使用されるフィールド数は最大で10です。 検索条件は、「=」条件と限定できるのですか?また、andのみでorはないのですか? >order byに使用されるフィールド数は3です。 母体が約100万件とのことですが、その内、1回の検索で、最大で何件くらい検索されることになるのでしょうか? インデクスは、データの絞込みだけでなく、ソート抑止による性能向上にも有効です。ソート抑止するには、order byの列の指定とインデクスの先頭からの構成列が一致している必要があります。 >このような場合、インデックスを張る方法として、どの方法が一番よいのでしょうか? 単一の列に各々インデクスを定義する場合、各列の条件でそれぞれ絞り込み効果が高くないと、性能が改善するどころかオーバヘッド要因になる場合があります。 複数列(マルチカラム)インデクスを定義する方が、恐らく効果が高いと思います。 すべての組み合わせに定義した方がいいかどうかは、今の情報からだけでは判断できません。重複データ数などにより、結果的に特定のケースの場合は、複数列インデクスである程度絞込み、あとは表データを見る方が早い場合もあるでしょう。 また、インデクスを何本も付ける場合は、追加、更新、削除でオーバヘッド要因になることも無視できません。 >また、80フィールドのテーブルを適当に4つくらいに分けて、検索時に結合すれば早くなったりするものでしょうか? 今の情報だけでは、判断できません。 以下のurlは、mysql 5.1のマニュアルの最適化の記述箇所です。 mysql 5.0は英文マニュアルしかないと思うので、mysql 5.1で違う部分もあるかも知れませんが、基本的な考え方は大きくは変わらないと思います。 http://dev.mysql.com/doc/refman/5.1/ja/optimization.html