【问题标题】:sqlite3 database help in improving performance and designsqlite3 数据库有助于提高性能和设计
【发布时间】:2014-07-22 12:22:53
【问题描述】:

我有一个使用此架构的 sqlite3 数据库:

CREATE TABLE [dict] (
  [Entry] [CHAR(209)], 
  [Definition] [CHAR(924975)]);

CREATE INDEX [i_dict_entry] ON [dict] ([Entry]);

它是一种字典,有 260000 条记录,大小接近 1GB;我为Entry 列创建了索引以提高性能;

一行输入列的示例如下:

|love|lovingly|loves|loved|loving|

所有用|分隔的词都指同一个定义;(我把它们都放在一个字符串中,用|分隔以防止Definition列中的数据重复)

这是我用来检索结果的命令:

SELECT * FROM dict WHERE Entry like '%|loves|%'

执行时间:~1.7s

如果我使用= 运算符而不是LIKE 运算符,则执行几乎是瞬时的;

SELECT * FROM dict WHERE Entry='|love|lovingly|loves|loved|loving|'

但是这样我就无法搜索诸如:love,loves...(我的意思是分开的)之类的词

我的问题:

虽然我已经为Entry 列创建了索引,但是当我们使用LIKE 运算符和% 时,索引真的有效吗?

如果我为复合 Entry 列的每个部分创建不同的行(一个代表爱另一个代表爱...然后所有将具有相同的定义)然后使用 = 运算符,这个想法怎么样?如是;反正有数据的引用吗?我的意思是不要为每个条目重复相同的Definition,而是创建一个并且所有其他条目都指向它;有可能吗?

提前感谢任何提示和建议;

【问题讨论】:

    标签: select sqlite indexing sql-like


    【解决方案1】:

    每个条目在数据库中应该有一个单独的行:

    CREATE TABLE Definitions (
        DefinitionID INTEGER PRIMARY KEY,
        Definition TEXT
    );
    CREATE TABLE Entries (
        EntryID INTEGER PRIMARY KEY,
        DefinitionID INTEGER REFERENCES Definitions(DefinitionID),
        Entry TEXT
    );
    CREATE INDEX i_entry ON Entries(Entry);
    

    然后您可以通过连接两个表来查询定义:

    SELECT Definition
    FROM Entries
    JOIN Definitions USING (DefinitionID)
    WHERE Entry = 'loves'
    

    另见Database normalization

    【讨论】:

    • 令人印象深刻!编码迁移到新模式后,这里是查询的执行时间:0.00099999999997635s
    猜你喜欢
    • 2012-04-27
    • 1970-01-01
    • 2012-01-20
    • 2011-01-29
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多