2012-09-02 11 views
5

ファイルとカテゴリ間の接続を表す次の表(file_category_tbl)があります。次のインデックスを正しく作成するにはどうすればよいですか?

fileId - bigint(20)   
categoryId - bigint(20) 
order - int(10) 

カテゴリ内のファイルを注文することができるように、私は順序フィールドを持っている... したがって、私の質問は、インデックスが、私は次のように、最適なパフォーマンスを得るために必要となるものです。

SELECT * FROM file_category_tbl WHERE categoryId="3" ORDER BY order ASC 

ユニークなインデックスがユニークです(fileIdcategoryId)。 同じものはあり得ないので、同じcategoryIdを持つfileIdはありません。 categoryIdにも索引があります。これは検索対象となっているためです。 私はorderにもインデックスを持っていますか?...これは必要ですか?それが唯一の私の理解によれば、これにorderBy ...任意の応答者へ

種類よろしく... J

+0

私は 'categoryId、order'の複数のインデックスで上記のクエリで十分だと思います。 – Ankur

+0

私はmysqlが' ORDER BY'パートのインデックスについて気にしなかったと思いました。編集:mysqlが 'ORDER BY'でインデックスを使用することができるかどうかは、多くの点で異なります:http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html – Krycke

答えて

1

をやっているように、あなたのインデックスが賢明であると、クエリのパフォーマンスの方に役立ちます。しかし、私はまた、あなたのテーブルにPrimary Key率を有するように提案するだけではなく、私はあなたがこのテーブルのあなたの記録のいずれかを参照したい場合は、することができ、これをされて言っている組み合わせUnique Index

理由を持つでしょうそれを削除したり、他の機能を実行するには、主キーが便利です。一方、実際には、すべてのフィールドを必要とし、主キーフィールドで4つのフィールドを持たなければならないため、クエリのパフォーマンスが実際に低下する可能性があります。そのためのソリューションとして、結果に必要な列を指定できます。 ORDER BY Optimizationの下で文書化されたよう

ホープこれは

2

:-)理にかなって:それはまだ見つけるためにインデックスを使用していますが、いくつかのケースでは

、MySQLの使用インデックスは、ORDER BYを解決することはできませんWHERE句に一致する行。

SELECT * FROM t1 WHERE key2=constant ORDER BY key1;

[ deletia ]

  • 行をフェッチするために使用される鍵はORDER BYで使用されるものと同じではない。これらの場合には、以下が挙げられます

    したがって、現在の索引付けはソート操作の実行には使用できませんn。しかし、同じページもの文書:

    ORDER BYが正確にインデックスが一致しない場合、インデックスも、でも使用することができます限り、インデックスの未使用部分とすべての余分なORDER BYのすべてとして列は、WHERE節の定数です。以下のクエリは、ORDER BY一部を解決するためにインデックスを使用する:

    [ deletia ]

    したがって (categoryId,order)上複合インデックスが 両方フィルタ ソート操作のために使用することができる
    SELECT * FROM t1 
        WHERE key_part1=constant 
        ORDER BY key_part2;

    、これはこのクエリの最適な結果です。

関連する問題