概述
索引,即属性索引,是嬴图采用的一种技术,通过为点和边的指定属性创建索引来加速查询性能。数据库根据有索引的属性能够快速定位并获取数据。索引对大型数据集尤其有益,无需扫描全图即可优化对特定属性值的过滤。
索引类型
嬴图支持对单个属性应用单一索引,对同一schema下的多个属性应用复合索引。
显示索引
显示当前图集的索引信息:
// 显示所有索引
show().index()
// 显示所有点索引
show().node_index()
// 显示所有边索引
show().edge_index()
索引信息展示在表_nodeIndex
和_edgeIndex
中。表中各字段提供了索引的基础信息:
字段 |
描述 |
---|---|
id |
索引ID |
name |
索引名称 |
properties |
索引关联属性 |
schema |
索引关联属性所在schema |
status |
索引当前状态,包括DONE 和CREATING |
创建索引
使用单个create()
语句可创建一或多个索引。串联使用node_index()
或edge_index()
方法可指定每个索引。请注意,每个属性只能有一个索引。索引创建操作以作业形式进行,稍后可使用show().job(<id?>)
确认索引是否成功创建。
为提升查询性能,嬴图中的系统属性已完成优化,具有内建效率。不过这些属性不支持额外索引。
create()
.node_index(@<schema>.<property>(<length?>), "<indexName>")
.edge_index(@<schema>.<property>(<length?>), "<indexName>")
.node_index(@<schema>(<property1>(<length1?>), <property2>(<length2?>), ...), "<indexName>")
.edge_index(@<schema>(<property1>(<length1?>), <property2>(<length2?>), ...), "<indexName>")
...
方法 | 参数 | 描述 |
---|---|---|
node_index() 或edge_index() |
@<schema>.<property>(<length?>) 或@<schema>(<property1>(<length1?>), <property2>(<length2?>),...) |
对于单一索引,使用@<schema>.<property> 指定属性和schema对于复合索引,使用 @<schema>(<property1>, <property2>,...) 列举同一schema下的多个属性对于这两种索引类型,如果属性类型为 string 或text ,需指定搜索时为了使用索引能够使用的最大字符串长度[1],从而避免索引长文本时可能出现的性能降级情况 |
<indexName> |
索引名称。点索引不可重名,边索引也不可重名,但点索引可以和边索引重名 |
[1] 一个中文字符的长度为3。
为点属性@card.balance
创建单一索引balance
:
create().node_index(@card.balance, "balance")
为边属性@card.name
(string
类型)创建单一索引cName
,并限制最大查询字符串长度为10
:
create().edge_index(@card.name(10), "cName")
为边@transfer
的属性amount
和notes
(text
类型,限制最大查询字符串长度为10
)创建复合索引transAmountNotes
:
create().edge_index(@transfer(amount, notes(10)), "transAmountNotes")
创建多个索引:
create()
.node_index(@card.balance, "balance")
.edge_index(@transfer(amount, notes(10)), "transAmountNotes")
删除索引
使用单个drop()
语句可删除一或多个索引。串联使用node_index()
或edge_index()
方法可指定每个索引。删除索引不会影响存储在分片中的真实属性值。不过删除属性会自动删除相关索引。
删除点索引balance
:
drop().node_index("balance")
删除边索引transAmountNotes
:
drop().edge_index("transAmountNotes")
删除多个索引:
drop().node_index("balance").edge_index("transAmountNotes")
使用索引
当查询过滤用到相关属性时,系统会自动应用索引,无需显式声明。
最左前缀原则
复合索引中属性的顺序非常重要:匹配到索引最左侧属性(即指定顺序里的首个属性或前几个属性)的查询会因此受益。
例如:
create().node_index(@user(name(10),age), 'name_age')
find().nodes({@user.name == "Kavi" && @user.age > 20})
使用了索引。find().nodes({@user.name == "Kavi"})
使用了索引。find().nodes({@user.age > 20})
未使用索引。find().nodes({@user.name == "Kavi" && @user.age > 20 && @user.grade == 7})
使用了索引,同时包含对属性@user.grade
的过滤,但该属性没有索引。
字符串长度限制
对于string
或text
类型属性的索引,需确保过滤字符串的长度未超过指定上限。
例如:
create().edge_index(@user.name(8), "Username")
以下查询不会使用索引Username
,因为指定的字符串超过了8字符的限制:
find().nodes({@user.name == "Aventurine"}) as n return n