2014-01-16 74 views
0

我在一個Android應用程序中使用SQLite,該應用程序應存儲數千個聲音軌道。我決定使用Track_title作爲索引來加快選擇和搜索。經過長時間的閱讀後,我從這個來源LINK瞭解到,INDEX將使SELECT更快,但會使INSERT變慢。他們建議在插入大數據之前從表格中刪除index,然後再重新放入。 使用這個語法:何時使用CREATE INDEX以及何時使用USE INDEX

CREATE INDEX my_idx ON my_table (my_attribute); 

一些其他來源,建議使用index而不是從這個LINKTABLE的創作進行select查詢。使用此語法:

SELECT * FROM my_table USE INDEX (col1) 
WHERE col1= name; 

問題是:哪一種方法會給我更好的性能?兩者的優點和缺點是什麼?

+1

您的索引不執行任何操作,因爲它與查詢無關。通常,索引使用是基於where子句自動生成的。 – njzk2

+0

我想你是誤解了這兩個命令,它們不是同義詞。如果不先創建它,就不能使用'USE INDEX'(使用CREATE INDEX')。當優化程序沒有使用實際上有助於查詢執行的特定索引時,應該使用'USE INDEX'(小心),並且您希望強制使用此索引。 – GarethD

+2

SQLite不是MySQL,所以不要看MySQL文檔。你不能在SQLite中使用'USE INDEX'。 –

回答

1

這兩個不是不相容的。除非已創建索引,否則不能使用索引。

你的桌子很小,只有幾千行。我不擔心表格創建的性能,除非你特別經歷過。

索引的工作方式與本書最後的索引相似。如果您想查找特定標題,引擎可以快速掃描索引並確定哪些數據記錄包含該標題。當數據在表中被插入/更新/刪除時,會產生開銷,因爲必須維護索引。

將數百萬行插入表中時,這可能是一個很大的性能問題,特別是空表。這就是您想要刪除索引並在數據位於表格中之後再次添加索引的情況。這個想法是,引擎可以創建索引的速度比可以插入一行又一行更快。

最後一個注意事項。當索引中的列在onwhereorder by中被引用時,查詢通常使用索引。在您的示例中,索引包含一個名爲my_attribute的列,但查詢引用的是col1。索引不會用於此查詢。

+0

當然,我會在select查詢中使用'my_attribute'。 'col'就是一個例子。這就是爲什麼我想使用它的指數。你對我的問題的最終建議是什麼? –

+1

如果遇到性能問題,請添加使查詢工作所需的索引。不要擔心插入/更新,除非您遇到性能問題。 –

相關問題