問題描述:
例如Sqlite中有一張表A,分別有字段ID,field1,field2,field3,field4,主鍵為ID,在field4上建立索引:create index [index_A] on [A] ([field4] collate nocase); field4為varchar類型。
A表數據量15萬左右,假設有查詢語句:select * from A where field4='具體值' 和 select * from A where field4 like '%具體值%'
發現兩者的執行時間竟然都差不多,select * from A where field4='具體值' 中field4索引並沒有起作用。此時select * from A where field4 like '具體值' 執行時間反而會更短。
可能原因:
建索引時指定了"collate nocase",可能導致索引失效了。另:"collate rtrim"也可能會造成索引失效。
解決方法:
只需在創建索引時去掉"collate nocase"即可,默認為"collate binary"。去掉"collate nocase"之后,查詢時間明顯縮短,索引起作用了。
附:
CREATE INDEX命令由“CREATE INDEX”關鍵字后跟新索引的名字,關鍵字“ON”,待索引表的名字,以及括弧內的用於索引鍵的字段列表構成。每個字段名可以跟隨“ASC”或“DESC”關鍵字說明排序法則,但在當前版本中排序法則被忽略。排序總是按照上升序。
每個字段名后跟COLLATE子句定義文本記錄的比較順序。缺省的比較順序是由CREATE TABLE語句說明的比較順序。若不定義比較順序,則使用內建的二進制比較順序。
附加到單個表上的索引數目沒有限制,索引中的字段數也沒有限制。
若UNIQUE關鍵字出現在CREATE和INDEX之間,則不允許重名的索引記錄。試圖插入重名記錄將會導致錯誤。
每條CREATE INDEX語句的文本儲存於sqlite_master或sqlite_temp_master表中,取決於被索引的表是否臨時表。
每次打開數據庫時,所有的CREATE INDEX語句從sqlite_master表中讀出,產生SQLite的索引樣式的內部結構。
若使用可選的IF NOT EXISTS子句,且存在同名索引,則該命令無效。