2009-10-22 30 views
1

我有一個包含uniqe的URL的文本列。SQLite在使用時總是執行全表掃描?

我需要做一個SQL模式匹配查詢,比如說使用'like'SQL運算符。

在這種情況下,SQLite會做FTS(全表掃描),無論我在該列上是否有索引(列是主鍵)?

它似乎是做了一個FTS作爲操作速度告訴 - 或速度的影響,由於'喜歡'查詢雖然列索引?

回答

2

The SQLite Query Planner

4.0 LIKE優化是由等或 GLOB操作有時可以用來 約束指數

條款。有在此使用的許多 條件:

  1. 等,或GLOB運算符的左側必須是 一個索引列的名稱。
  2. LIKE或GLOB的右側必須是字符串文字, 不以通配符 字符開頭。 [...]

更新:默認case_sensitive_like模式關閉。將其打開可能會使其行爲如同=

PRAGMA case_sensitive_like = ON; -- OFF 
SELECT * FROM your_table WHERE field LIKE '...' 
+0

左邊的like是主鍵,右邊是一個常量字符串,後面跟着一個通配符。 正如我所說的,大部分「模式」字符串都是常量 - 比如'ftp:abs.com' - 所以根本不需要使用!爲了這個原因,我寫了一行代碼,在沒有通配符的情況下,調用一個使用'='而不是'like'的查詢版本,而且速度更快 - '='需要3秒的時間,像'42分鐘!如果沒有使用通配符,是否沒有辦法讓'like'調用'='? – PoorLuzer 2009-10-22 21:58:36

+0

@PoorLuzer,看看我的更新。 – 2009-10-22 22:15:41

+0

..今天我會看看,讓你知道。 – PoorLuzer 2009-10-23 01:58:03

4

如果操作數字符串以通配符開頭(「LIKE'%foo'」),LIKE運算符將執行全表掃描。它將使用索引(如果可用),否則。

1

如果您的LIKE在匹配表達式的開頭使用通配符,例如'%hris McCall',則不會使用索引。

+0

不幸的是,通配符「%」作爲後綴 - 在一個恆定的文字 - 像「FTP%」 令人詫異的是,我剛剛完成了數據分析的一點點,它看起來像大部分「模式」字符串都是常量 - 比如'ftp://abs.com' - 所以根本不需要使用! 爲了這個原因,我寫了一行代碼,在沒有通配符時調用一個使用'='而不是'like'的查詢版本,它的速度更快 - '='需要3秒的時間需要'喜歡'42分鐘! 如果沒有通配符被使用,是否沒有辦法讓'like'調用'='? – PoorLuzer 2009-10-22 21:22:25

+1

爲什麼您將SQLite用於有足夠數據需要42分鐘的項目?這必須是數百GB的數據。 – erikkallen 2009-10-22 22:11:39

+0

...或者可能不是數百,但可能是數十。 – erikkallen 2009-10-22 22:12:26

相關問題