官术网_书友最值得收藏!

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。

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

主站蜘蛛池模板: 哈密市| 团风县| 莒南县| 苏州市| 阜平县| 根河市| 将乐县| 泰安市| 乌兰察布市| 上犹县| 喀喇| 湘乡市| 安宁市| 怀宁县| 秀山| 和林格尔县| 广宗县| 突泉县| 库车县| 竹山县| 韩城市| 长泰县| 香格里拉县| 苏尼特左旗| 探索| 台州市| 襄樊市| 中方县| 调兵山市| 苗栗县| 晴隆县| 田东县| 赣州市| 卢龙县| 剑川县| 和硕县| 河源市| 隆化县| 昌邑市| 桐梓县| 尚志市|