表上的Android SQLite索引

时间:2016-07-11 07:01:14

标签: android sqlite

我在SIP应用中有一个表格,用于存储您所有帐户的通话记录。我不是多列主键的朋友,所以我把自动增量列作为我的PK。

表格的第一列是

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

我从CallManager(SIP服务器)获得callId,这对于一个帐户是唯一的(因此accountId + callId一起构建一个唯一的对)。

我设置了这样的索引:

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

我在应用程序中对此表有几个查询,有些只查询accountId,有些查询对(取决于Activity)。 我是否真的需要两个索引,或者accountId子句中只有where的查询是否也使用唯一索引?

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

来自doc(1.6多列指数):

  

多列索引遵循与单列相同的模式   指数;索引列添加在rowid前面。唯一的   区别在于现在添加了多个列。最左边的   column是用于对索引中的行进行排序的主键。该   第二列用于打破最左列中的关系。如果有   是第三列,它将用于打破前两个的关系   列。等等索引中的所有列。因为rowid是   保证是唯一的,即使索引的每一行都是唯一的   两行的所有内容列都是相同的。

因此,ACCOUNTID和CALLID字段的索引已经处理了ACCOUNTID的排序,因此在这种情况下不需要在ACCOUNTID上创建索引。