2011-02-03 7 views
1

このように、テーブルのインデックスを特定の行セットのみに作成するという面白い要求があります。mysqlの特定の行にのみインデックスを作成する

これは私のテーブルには、次のようになります。

USER:ユーザーID、作成、friendid、blah0、blah1、...、blahN

今、私はANを作成したいのですが上のインデックス:

(ユーザーIDは、作成された、friendid)

ただし、userid = friendidの行でのみ使用できます。このインデックスは、WHERE句に "userid = friendid"が含まれるクエリを満たすためにのみ使用されるためです。これが当てはまらない行がたくさんあります。インデックス上の余分なスペースをすべて無駄にしたくありません。

もう1つのオプションは、このテーブルの挿入/更新時に作成されたテーブル(クエリテーブル)を作成し、それを行うためのトリガーを作成することですが、再びそのテーブルのインデックスを推測しています2回保管してください。

mysqlは主キーをどのように保存しますか?つまり、プライマリキーで注文されたテーブルか、挿入注文で注文され、PKは通常のユニークインデックスのようですか?

クラスタ化されたインデックス(http://dev.mysql.com/doc/refman/5.0/en/innodb-index-types.html)をチェックしましたが、InnoDBだけがサポートしているようです。 MyISAMを使用しています(これは、クエリテーブルの3つのフィールドにクラスタ化インデックスを作成できたためです)。

私は基本的にこのような何かを探しています:

のALTER TABLEユーザーは条件付きインデックスについては、ユーザーID =

+0

明らかに、私の要件はあまり面白くありません。 db.cs.berkeley.edu/papers/ERL-M89-17.pdf – dhruvbird

答えて

3

をfriendid INDEX(ユーザーIDは、作成friendid)ADD:

これはできません。 MySQLにはそのようなことはありません。

主キーについて:

これは、ストレージエンジンに依存します。 MySQLはデータの格納方法や取得方法を定義していません。それはストレージエンジンに委ねられています。

MyISAMでは、行の格納方法は決まりません。それらはテーブルの末尾に追加されますが、削除の隙間は再利用することができ、UPDATEクエリはDELETEがなくても順序を乱す可能性があります。

InnoDBは、主キーの順に行を保存します。

+0

関数ベースのインデックスかもしれませんが、MySQLはそれをサポートしていません。 –

+0

ありがとう!!あなたが知っている可能性のあるハック/近似はありますか? – dhruvbird

+0

@OMG ponyies:関数ベースのインデックスをサポートするDBを知っていますか? – dhruvbird

0

ここで実際に何をしようとしているのか(なぜユーザーは自分の友人である必要がありますか)は分かりませんが、データベーススキーマを単純に考え直すとこの問題は解決します。

テーブル1:USER:userid、作成済み、blah0、blah1、...、

表2:ちょうどuserIsFriend(ユーザー1、ユーザー2、...)

及び表2に、あなたのインデックス付けを行う(その要素はおそらく表1に外部キー制約を持つ)

ところであなたはおそらくべきとにかく、IMHOと何らかのセミ真剣をしたい場合は、InnoDBを使用してください。

+0

USERSテーブルは単なる例です。さらに、このようなテーブルのためにあなたのデータベースにID行が必要な場合は有効です(ユーザーは自分の友人です)。 – dhruvbird

+0

InnoDBが行っている限り、私はトランザクションを使用していないので、私はそれらのために価格を支払うつもりはありません。 – dhruvbird

関連する問題