概述
索引,即属性索引,是嬴图采用的一种技术,通过为点和边的指定属性创建索引来加速查询性能。数据库根据有索引的属性能够快速定位并获取数据。索引对大型数据集尤其有益,无需扫描全图即可优化对特定属性值的过滤。
索引类型
嬴图支持对单个属性应用单一索引,对同一schema下的多个属性应用复合索引。
显示索引
显示当前图集的点索引信息:
SHOW NODE INDEX
显示当前图集的边索引信息:
SHOW EDGE INDEX
索引信息展示在表_nodeIndex
和_edgeIndex
中。各表提供了索引的基础信息:
字段 |
描述 |
---|---|
id |
索引ID |
name |
索引名称 |
properties |
索引关联属性 |
schema |
索引关联属性所在schema |
status |
索引当前状态,包括DONE 和CREATING |
创建索引
使用CREATE INDEX
语句可创建一个索引。请注意,每个属性只能有一个索引。索引创建操作以作业形式进行,稍后可使用SHOW JOB
确认索引是否成功创建。
为提升查询性能,嬴图中的系统属性已完成优化,具有内建效率。这些属性不支持创建索引。
<create index statement> ::=
"CREATE INDEX" <index name> "ON" < "NODE" | "EDGE" > <schema name>
"(" <property index item> [ { "," <property index item> }... ] ")"
<property index item> ::=
<property name> [ "(" <bytes> ")" ]
详情
- 对
<index name>
而言,点索引不可重名,边索引也不可重名,但点索引可以和边索引重名。 - 对于单一索引,指定单个
<property index item>
;对于复合索引,列出多个<property index item>
。 - 如果指定属性的类型为
string
或text
,必须指定过滤器中字符串的最大字节数<bytes>
以应用该索引。标准英文文本中,大多数编码(如 ASCII或UTF-8)的每个字符使用1个字节。非英文字符的大小可能有所不同。例如,一个中文字符的大小为3字节。更多信息,请参阅字符串大小限制。
为点card
的属性balance
创建名为cBalance
的单一索引:
CREATE INDEX cBalance ON NODE card (balance)
为点card
的属性name
(string
类型)创建名为name
的单一索引,并限制最大查询字符串长度为10
:
CREATE INDEX name ON NODE card (name(10))
为边transfer
的属性amount
和notes
(text
类型,限制最大查询字符串长度为10
)创建名为transAmountNotes
的复合索引:
CREATE INDEX transAmountNotes ON EDGE transfer (amount, notes(10))
删除索引
使用语句DROP NODE INDEX
或DROP EDGE INDEX
删除索引。删除索引不会影响存储在分片中的真实属性值。
拥有索引的属性无法被删除。删除属性需要先删除索引。
删除点索引cBalance
:
DROP NODE INDEX cBalance
删除边索引transAmountNotes
:
DROP EDGE INDEX transAmountNotes
使用索引
当查询过滤用到相关属性时,系统会自动应用索引,无需显式声明。
最左前缀原则
复合索引中属性的顺序非常重要:匹配到索引最左侧属性(即指定顺序里的首个属性或前几个属性)的查询会因此受益。
例如:
CREATE INDEX name_age ON NODE user (name(10),age)
MATCH (u:user WHERE u.name = "Kavi" AND u.age > 20)
使用了索引。MATCH (u:user WHERE u.name = "Kavi")
使用了索引。MATCH (u:user WHERE u.age > 20)
未使用索引。MATCH (u:user WHERE u.name = "Kavi" AND u.age > 20 AND u.grade = 7)
使用了索引,同时包含对属性grade
的过滤,但该属性没有索引。
字符串大小限制
对于string
或text
类型属性的索引,需确保过滤器中使用字符串大小未超过指定上限。
例如,为user
点的name
属性创建索引Username
,索引使用的字符串大小限制为8字节:
CREATE INDEX Username ON NODE user (name(8))
以下查询不会使用索引Username
,因为指定的字符串Aventurine
超过了8字节的限制:
MATCH (n:user {name: "Aventurine"})
RETURN n