2016-07-11 11 views
1

すべてのアカウントの通話履歴を保存するテーブルがSIPアプリケーションにあります。私は複数列の主キーの友人ではないので、私は自分のPKとして自動インクリメント列を配置します。テーブル上のAndroid SQLiteインデックス

表の最初の列は、私はアカウントに固有のCallManagerの(SIPサーバ)、(そうたaccountId + callIdが一緒にユニークなペアを構築)からcallIdを取得

CREATE TABLE IF NOT EXISTS CALLHISTORY 
    (
     CALLHISTORYID   INTEGER PRIMARY KEY AUTOINCREMENT, 
     ACCOUNTID    INTEGER NOT NULL, 
     CALLID     TEXT  NOT NULL, 
     ... + many more columns 

です。

私はこのようなインデックスを設定:

CREATE INDEX IF NOT EXISTS IX_CALLHISTORY_ACCOUNTID ON CALLHISTORY (ACCOUNTID); 
CREATE UNIQUE INDEX UIX_CALLHISTORY_ACCOUNTID_CALLID ON CALLHISTORY (ACCOUNTID,CALLID); 

Iは、いくつかのアプリケーションでは、このテーブルにクエリ、いくつかのクエリのみaccountIdを、いくつかのペアを照会する(活性に依存する)を有します。 私は本当に両方のインデックスが必要ですか、またはwhere句にaccountIdだけしか含まれていないクエリもユニークインデックスを使用しますか?

ありがとうございました! doc(1.6マルチ列インデックス)から

+0

マルチカラムPKを使用しない*技術的な理由はありますか? –

+0

callHistoryIdをいくつかのメソッドで渡しています。 1つの整数値だけを渡す方が簡単で、メソッドの戻り値としても機能します。常に2つのフィールドが含まれていた場合(または、結合されたキーの新しいデータ保持者クラスが必要です)、私はできません。 – Grisgram

答えて

2

複数列インデックスは、単一列 インデックスと同じパターンに従います。索引付けされた列はROWIDの前に追加されます。 の違いは、複数の列が追加された点だけです。最も左側の 列は、索引内の行の順序付けに使用される主キーです。 の2番目の列は、一番左の列の結び目を破るために使用されます。 が3番目の列だった場合は、最初の2つの列の連結を解除するために使用されます。 索引のすべての列についても同様です。 rowidは が一意であることが保証されているため、 の2行のコンテンツ列がすべて同じ場合でも、インデックスのすべての行は一意になります。

この結果、ACCOUNTIDおよびCALLIDフィールドの索引はすでにACCOUNTIDの順序を処理しているため、ACCOUNTIDの索引を作成する必要はありません。

+0

私のためにこれをクリアしていただきありがとうございます! – Grisgram

関連する問題