2015-02-09 59 views
0

條目表格包含以下列:id,漢字,假名,含義,化合物。該表具有以下DDL:SQLite。如何優化SELECT子查詢?

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(); 

如何優化選擇子查詢,使其更快?

+0

'kanji' /'kana'列有索引嗎? – 2015-02-09 08:01:33

+0

漢字和假名列上沒有索引。只有'id'列是主鍵。 – 2015-02-09 08:04:07

+0

單詞邊界搜索不能使用任何內置機制進行優化。 (並且示例查詢與代碼不匹配。) – 2015-02-09 08:29:55

回答

2

你可以做的事情不多。由於LIKE搜索,dbms必須讀取每條記錄才能找到所需的記錄。所以把你的數據庫放在一個快速驅動器上就是這樣。

您可以嘗試在(kanji,kana,id)上創建索引。通過索引中的所有三個相關列,SQLite可以決定從索引獲取所有數據,而不是讀取表。儘管SQLite數據庫駐留在磁盤上的單個文件中,但我不知道這有多可能。

+0

也許,我應該將所有數據都放入FTS,然後使用該表運行查詢。你怎麼看,這可以幫助提高性能? – 2015-02-09 09:22:55

+0

很抱歉,我無法回答這個問題,因爲我沒有全文搜索的經驗。也許你應該把這個問題作爲一個單獨的問題,FTS是否適合你的數據和搜索標準。正確標記這應該很快給你答案。 – 2015-02-09 10:06:09