2017-07-06 165 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