SQLite - 从SQLite数据库读取数据的最快方法?

PaR*_*RaJ 6 c# database sqlite query-optimization

我有一个本地SQLite数据库

表详细信息

-- Describe PREFIX_LIST
CREATE TABLE PREFIX_LIST(ITEM VARCHAR(25) PRIMARY KEY)

-- Describe SUFFIX_LIST
CREATE TABLE SUFFIX_LIST(ITEM VARCHAR(25) PRIMARY KEY)

-- Describe VALID_LIST
CREATE TABLE VALID_LIST (
    "PART1" TEXT,
    "PART2" TEXT,
    PRIMARY KEY(PART1, PART2)
)
Run Code Online (Sandbox Code Playgroud)

现在这个列表非常庞大,我需要从中保存数据.

这是我的实施.

SQLiteConnection con = null;
SQLiteCommand cmd = null;
Connect(DbPath, ref con, ref cmd);

cmd.CommandText =
    "SELECT PART1 || '@' || PART2 FROM VALID_LIST 
 WHERE NOT EXISTS 
   (SELECT * FROM PREFIX_LIST WHERE VALID_LIST.PART1 LIKE '%' || ITEM || '%') 
   AND NOT EXISTS
   (SELECT * FROM SUFFIX_LIST WHERE VALID_LIST.PART2 LIKE '%' || ITEM || '%')";

var reader = cmd.ExecuteReader();

if (reader.HasRows)
{
    string savePath;

    if (SaveTextFile(out savePath) == DialogResult.OK)
    {
        TextWriter writer = new StreamWriter(savePath);
        while (reader.Read())
        {
            writer.WriteLine(reader.GetString(0));
        }
        writer.Close();
        writer.Dispose();
    }

}

reader.Close();
reader.Dispose();
cmd.Dispose();
con.Close();
con.Dispose();

MessageBox.Show("List Saved!.", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information);
Run Code Online (Sandbox Code Playgroud)

我需要一些更好的方法,我可以更快地保存列表.VALID_LIST中的总条目是2639117

并且花了15分钟为上面的SQL QUERY保存它!

请lmk如果可以优化SQL查询!

提前致谢

Tom*_*err 6

LIKE除非通配符附加到后缀,否则查询一般会非常慢.诸如LIKE '%foo'无法通过典型的字符串索引编制索引的谓词.

但是,您可以LIKE使用全文搜索(FTS)功能替换sqlite中的大量使用.

FTS3和FTS4扩展模块允许用户创建具有内置全文索引的特殊表(以下称为"FTS表").全文索引允许用户有效地在数据库中查询包含一个或多个单词的所有行(以下称为"标记"),即使该表包含许多大型文档.

他们有一个在用例性能方面看起来很有前途的例子.

CREATE VIRTUAL TABLE enrondata1 USING fts3(content TEXT);     /* FTS3 table */
CREATE TABLE enrondata2(content TEXT);                        /* Ordinary table *

SELECT count(*) FROM enrondata1 WHERE content MATCH 'linux';  /* 0.03 seconds */
SELECT count(*) FROM enrondata2 WHERE content LIKE '%linux%'; /* 22.5 seconds */
Run Code Online (Sandbox Code Playgroud)