SQLite的。如何优化SELECT子查询?

时间:2015-02-09 07:53:51

标签: sql sqlite select jdbc sql-optimization

条目表包含以下列:id,kanji,假名,含义,化合物。该表有以下DDL:

CREATE TABLE entry (
id INTEGER PRIMARY KEY, 
kanji TEXT, 
kana TEXT, 
meaning TEXT,
compounds BLOB);

我想更新列化合物。此列包含与此条目类似的条目ID。随着更新我没有问题。我需要使用SELECT子查询优化SQL查询。它非常慢(每个查询1020毫秒)。 例如:

SELECT GROUP_CONCAT(ent_com.id) AS comps FROM
(
SELECT * FROM entry
WHERE 
(kanji LIKE '斯う%' OR kanji LIKE '%斯う}' OR kanji LIKE '%{斯う')
 AND 
(kana LIKE 'こう%' OR kana LIKE '%こう}' OR kana LIKE '%{こう')
 AND id!=1004310
) 
ent_com
ORDER BY length(ent_com.[kanji]),length(ent_com.[kana])
汉字(象形文字)和假名(日语平假名和片假名字母)单词以' {'结尾于'}'开头。我正在使用JDBC库与SQLite连接。

SELECT GROUP_CONCAT(ent_com.id) AS comps FROM
(
SELECT * FROM entry
WHERE 
(kanji LIKE ? OR kanji LIKE ? OR kanji LIKE ?)
 AND 
(kana LIKE ? OR kana LIKE ? OR kana LIKE ?)
 AND id!=?
) 
ent_com
ORDER BY length(ent_com.[kanji]),length(ent_com.[kana])

选择

        c.setAutoCommit(false);

        preparedStatementSelect = null;
        preparedStatementSelect = c.prepareStatement(sql_select_entry);

        preparedStatementSelect.setString(1, entry.getKeb_list().get(0)
                + "%");
        preparedStatementSelect.setString(2,
                "%" + entry.getKeb_list().get(0) + "}");
        preparedStatementSelect.setString(3, "%{"
                + entry.getKeb_list().get(0));

        preparedStatementSelect.setString(4, entry.getReb_list().get(0)
                + "%");
        preparedStatementSelect.setString(5,
                "%" + entry.getReb_list().get(0) + "}");
        preparedStatementSelect.setString(6, "%{"
                + entry.getReb_list().get(0) + "%");

        preparedStatementSelect.setString(7, entry.getEnt_seq());

        ResultSet rs = preparedStatementSelect.executeQuery();

如何优化选择子查询以使其更快?

1 个答案:

答案 0 :(得分:2)

你无能为力。由于LIKE搜索,dbms必须读取每个记录以便找到所需的记录。所以把你的数据库放在快速驱动器上。这是关于它的。

您可以尝试在(kanji,kana,id)上创建索引。通过索引中的所有三个相关列,SQLite可能决定从索引中获取所有数据,而不是根本不读取该表。由于SQLite数据库驻留在磁盘上的单个文件中,我不知道这有多大可能会有所帮助。