3.5 索引
3.5.1 簡介
數據庫索引是為了提升搜索效率而創建的某些數據的特殊冗余,以額外的存儲空間和寫操作為代價。確定索引數據的范圍,是一項重要且有一定難度的工作。Neo4j的索引由DBMS管理和更新,一旦創建并生效,Neo4j將自動選擇并使用。
3.5.1.1 索引類型
Neo4j支持以下類型的索引:
● b樹索引(b-tree):Cypher可以為擁有指定標簽的所有節點,或擁有指定關系類型的所有關系,建立基于單個或多個屬性的b樹索引。基于給定標簽或關系類型在單個屬性上創建的索引稱為單屬性索引。基于給定標簽或關系類型在多個屬性上創建的索引稱為復合索引。
● 全文索引(fulltext):詳見3.6節。
● 查找索引(lookup):查找索引只依賴節點標簽或關系類型,不考慮屬性。
● 文本索引(text):文本索引是一種單屬性索引,但只能用于字符串類型的屬性。如果節點的標簽或關系的關系類型不是字符串型,則這些節點和關系就不能被索引。
3.5.1.2 索引使用建議
使用索引有如下建議:
● 創建索引時明確其名稱。如果沒有命名,則數據庫會為索引會自動生成名稱。
● 索引的名稱必須在索引和約束中同時保持唯一。
● 默認情況下,索引不能重復創建,兩次創建相同的索引會報錯。使用IF NOT EXISTS子句可以避免這種報錯。
3.5.1.3 復合索引
復合b樹索引同單屬性b樹索引一樣,能支持所有的判斷式:
● 等值判斷:n.prop = value。
● 列表成員判斷:n.prop IN list。
● 存在判斷:n.prop IS NOT NULL。
● 范圍搜索:n.prop > value。
● 前綴判斷:STARTS WITH。
● 后綴判斷:ENDS WITH。
● 子串搜索:CONTAINS。
判斷式可能會被執行計劃(Execution Plan)優化為存在檢查和過濾器,為了避免這種情況,判斷式需要遵循以下限制規則:
● 如果有任何等值檢查和列表成員判斷,它們需要用于索引定義的第一個屬性。
● 最多可以有一個范圍判斷或前綴判斷。
● 可以有任意數量的存在判斷式。
● 范圍判斷、前綴判斷或存在判斷后的判斷式必須為存在判斷。而前綴判斷和子串判斷總是被調整為存在判斷式和過濾器,因此其后的所有判斷式也被調整為存在判斷式。
例如,一個索引基于標簽Label(prop1,prop2,prop3,prop4,prop5,prop6)的節點而建立,其判斷式如下:

因為n.prop3有一個range search判斷式,所以將被規劃為以下判斷式和過濾器n.prop4 < 'e'和n.prop5 = true:

又如,一個索引基于標簽:Label(prop1,prop2)的節點而建立,其判斷式如下:

因為n.prop1有一個前綴判斷式,所以將被規劃為以下判斷式和過濾器n.prop1 ENDS WITH 'x'和n.prop2 = false。

復合索引所有被索引的屬性都需要判斷式,如果只有一部分屬性使用了判斷式,復合索引就不能被使用。要想在這種情況下使用索引,就要在相關的屬性上單獨創建額外的索引。