2012-02-02 35 views
2

我有一個非常簡單的數據庫結構。我在一個表中有12列,大多數是varchar(< 50),約有8500行。如何加速或優化iOS的SQLite查詢?

當我在iPhone 4執行以下查詢,我一直在2.5-3平均秒鐘,結果:

SELECT * FROM names ORDER BY name COLLATE NOCASE ASC LIMIT 20

似乎並不喜歡這樣的事情應該是這麼慢。有趣的是,來自第二代iPod上運行的相同應用程序的相同查詢快了大約1.5秒。那部分超越了我。

我有有同樣的問題其他查詢: SELECT * FROM names WHERE SEX = ?1 AND ORIGIN = ?2 ORDER BY name COLLATE NOCASE ASC LIMIT 20

SELECT * FROM names WHERE name LIKE ?3 AND SEX = ?1 AND ORIGIN = ?2 ORDER BY name COLLATE NOCASE ASC LIMIT 20

我在SQLite的數據庫添加一個索引:CREATE INDEX names_idx ON names (name, origin, sex, meaning)其中nameoriginsexmeaning是我傾向於查詢的列與WHERELIKE運營商。

有關改善這些搜索性能的任何想法或者這是關於原子性的嗎?

+1

如果您在ORDER BY子句中刪除COLLATE運算符(即,只是'ORDER BY name ASC'),那麼您的三個查詢的相對性能如何? – pilcrow 2012-02-02 20:57:30

回答

3

索引CREATE INDEX names_idx ON names (name, origin, sex, meaning)將只用於,我相信,如果您的查詢包括所有這些列。如果只有一些用於查詢,則不能使用索引。

繼續您的第一個查詢:SELECT * FROM names ORDER BY name COLLATE NOCASE ASC LIMIT 20 - 我會建議在名稱上添加一個索引,就其本身而言,即CREATE INDEX names_idx1 ON names (name)。理論上這應該加快查詢速度。

如果您希望其他索引包含其他常用查詢的組合列,並且可以提高查詢速度,但記住它會增加數據庫大小。

+0

謝謝,這明顯加快了速度。 – 2012-02-03 15:59:36

1

什麼是最常用的搜索條件?如果您搜索名稱,例如您可以根據名稱首字母創建更多表。名稱以「A」開頭的表格等。類型相同。這會在某些情況下提高您的搜索性能。