不正確的collate造成sqlite索引失效?


    問題描述:

    例如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_mastersqlite_temp_master表中,取決於被索引的表是否臨時表。

    每次打開數據庫時,所有的CREATE INDEX語句從sqlite_master表中讀出,產生SQLite的索引樣式的內部結構。

    若使用可選的IF NOT EXISTS子句,且存在同名索引,則該命令無效。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM