2011-11-12 11 views
0

テーブルには、id(自動インクリメント)、userid(ユニーク、ssnなど)、ステータス(TINYINT(1)、0または1の値、NULLではない)、user_info varchar(1000))。ステータスに応じてWHEREのインデックスにあるインデックス

場合、私は、パフォーマンスを向上させるためにユーザーID列にインデックスを置く必要があります。リクエストの 30%は要求の

"SELECT user_info from Table1 WHERE userid='1234567'"; 

40%があるさ:リクエストの

"SELECT user_info from Table1 WHERE userid='1234567' AND status=0"; 

20%は次のとおりです。

"SELECT user_info from Table1 WHERE userid='1234567' AND status=1"; 

また、パフォーマンスを向上させるためのより良い方法があります(何とかステータス列の索引付け)?

(30%、40%、20%)ではなく実際に(9%、90%、1%)に変更する必要がありますか? ありがとうございます。

+1

"userid"のようなテーブル名は、その列が(Userテーブルのidフィールドに)外部キーであることを意味します。 InnoDBテーブルで外部キーとして定義した場合、自動的にインデックスが作成されます。 http://stackoverflow.com/questions/304317/does-mysql-index-foreign-key-columns-automaticallyインデックスFKの程度 良い情報: http://asktom.oracle.com/pls/apex/f≦p = 100:11:0 :::: P11_QUESTION_ID:292016138754 – OpenSorceress

答えて

3

statusのインデックスは、列の内容が十分に多様でないため、SELECTパフォーマンスを向上させる可能性は非常に低いです。 useridのインデックスは、列の内容が非常に多様であるため、パフォーマンスを大幅に向上させる可能性が非常に高いです。

userid列をuniqueと定義した場合、クエリでは自動的に作成された一意のインデックスが既に使用されているはずです。したがって、追加のインデックスを定義する必要はありません。

0

私はdelete id列(合成キー - それは何のためですか?)をお勧めします。より、user_id(最初)とステータス(秒)の累積PKを作成します。

さらに良い解決策 - PKからステータスを削除し、常にuser_idだけを選択してください。アプリケーションのステータスをチェックして404などを投げます。

関連する問題