2017-07-06 161 views
2

我的SQLite數據庫:SQLite的加快與整理NOCASE選擇

CREATE TABLE IF NOT EXISTS Commits 
(
    GlobalVer INTEGER PRIMARY KEY, 
    Data blob NOT NULL 
) WITHOUT ROWID; 
CREATE TABLE IF NOT EXISTS Streams 
(
    Name char(40) NOT NULL, 
    GlobalVer INTEGER NOT NULL, 
    PRIMARY KEY(Name, GlobalVer) 
) WITHOUT ROWID; 

我要讓1選擇:

SELECT Commits.Data 
    FROM Streams JOIN Commits ON Streams.GlobalVer=Commits.GlobalVer 
WHERE 
    Streams.Name = ? 
ORDER BY Streams.GlobalVer 
LIMIT ? OFFSET ? 

後,我想再拍選擇:

SELECT Commits.Data,Streams.Name 
    FROM Streams JOIN Commits ON Streams.GlobalVer=Commits.GlobalVer 
WHERE 
    Streams.Name = ? COLLATE NOCASE 
ORDER BY Streams.GlobalVer 
LIMIT ? OFFSET ? 

問題是,第二選擇作品超級慢。我認爲這是因爲COLLATE NOCASE。我想加快它。我試圖添加索引,但它沒有幫助(可能是我做了sometinhg錯誤?)。如何以大約等於1查詢的速度執行2個查詢?

回答

2

索引可以用來只有當它使用相同的排序規則查詢,以加速搜索。

默認情況下,指數需要從表列的排序規則,所以你可以改變表的定義:

CREATE TABLE IF NOT EXISTS Streams 
(
    Name  char(40) NOT NULL COLLATE NOCASE, 
    GlobalVer INTEGER NOT NULL, 
    PRIMARY KEY(Name, GlobalVer) 
) WITHOUT ROWID; 

然而,這將使第一個查詢慢。

要加快這兩個查詢,您需要兩個索引,每個排序規則一個。 (該指數加快ORDER BY在此查詢添加第二列)。

CREATE TABLE IF NOT EXISTS Streams 
(
    Name  char(40) NOT NULL COLLATE NOCASE, 
    GlobalVer INTEGER NOT NULL, 
    PRIMARY KEY(Name, GlobalVer) 
) WITHOUT ROWID; 
CREATE INDEX IF NOT EXISTS Streams_nocase_idx ON Streams(Name COLLATE NOCASE, GlobalVar); 

:所以要使用隱式指數爲顯性指標的默認排序規則,並NOCASE