条目表包含以下列: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])
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();
如何优化选择子查询以使其更快?
答案 0 :(得分:2)
你无能为力。由于LIKE搜索,dbms必须读取每个记录以便找到所需的记录。所以把你的数据库放在快速驱动器上。这是关于它的。
您可以尝试在(kanji,kana,id)
上创建索引。通过索引中的所有三个相关列,SQLite可能决定从索引中获取所有数据,而不是根本不读取该表。由于SQLite数据库驻留在磁盘上的单个文件中,我不知道这有多大可能会有所帮助。