Neo4j数据库
数据库索引
数据库索引是数据库中某些数据的冗余副本,目的是提高相关数据的搜索效率。这是以额外的存储空间和较慢的写操作为代价的,因此决定索引什么和不索引什么是一项重要的任务,而且通常不是简单的任务。
一旦创建了索引,DBMS将对其进行管理并保持更新。一旦索引创建并上线,Neo4j将自动拾取并开始使用它。
Cypher允许为具有给定标签的所有节点在一个或多个属性上创建索引:
- 在单个属性上为任何给定标签创建的索引称为单个属性索引。
- 在任何给定标签的多个属性上创建的索引称为复合索引。
- 最佳实践是在创建索引时给它一个名称。如果索引没有显式命名,它将得到一个自动生成的名称。
- 索引名在索引和约束中必须是唯一的。
- 索引创建不是幂等的。如果尝试两次创建相同的索引,将抛出一个错误。
为什么创建索引?
数据库索引是一种专用数据结构,允许我们快速定位信息。它的组织方式类似于二叉树结构,左侧值较小,右侧值较大。索引可以比较树状结构中的行值,以更快地定位所需数据,而不是强制扫描整个表。
数据库只做两件事情:存储数据、检索数据。而索引是在你存储的数据之外,额外保存一些路标(一般是B+树),以减少检索数据的时间。所以索引是主数据衍生的附加结构。
索引的本质是一种排好序的数据结构。例如把字典看做一个数据库,里面字及对应的解释是一条条数据,字典的目录就是一个索引,能让我们更快查到想找的字。
比如下图是《MySQL必知必会》的书尾索引,通过拼音首字母对关键词排序,定位到书中页码。我们在应用时想找哪个知识点就可以直接在这儿查而不用翻看目录,定位到大概位置,再一页页的翻找了。
索引索引怎么用?
一张表可以建立任意多个索引,每个索引可以是任意多个字段的组合。索引可能会提高查询速度(如果查询时使用了索引),但一定会减慢写入速度,因为每次写入时都需要更新索引,所以索引只应该加在经常需要搜索的列上,不要加在写多读少的列上。
只包含一个字段的索引叫做单列索引,包含两个或以上字段的索引叫做复合索引(或组合索引)。建立复合索引时,字段的顺序极其重要。
下面这个SQL语句在 列X,列Y,列Z 上建立了一个复合索引。
CREATE INDEX 索引名 ON 表名(列名X, 列名Y, 列名Z);
Neo4j创建索引
图数据库和关系型数据库创建索引的原理都是一样的,它们会在数据库中创建冗余的副本,会占用一些硬盘资源,从而到使写入速度变慢,所以需要做一些权衡,如果数据量不大,且查询效率很高,就没有必要创建索引。数据量越大,好的索引对查询效率的提升越大。
Neo4j创建索引的方法和sql类似比较简单,直接在cypher shell中执行语句即可:
CREATE INDEX 创建索引
DROP INDEX 删除索引
//CREATE INDEX ON 标签名(属性名)
CREATE INDEX ON :LABEL_NAME(property)
DROP INDEX ON :LABEL_NAME(property)
比如目前需要创建类型LABEL为CITY的节点索引,索引INDEX为城市名name:
CREATE INDEX ON :CITY(name) //创建name的索引
如果创建索引是在空库的情况下创建的,那么在后续的数据写入时速度会相对变慢,因为要一遍写入数据一边创建索引;而如果数据已经写入之后去创建索引,执行语句会显示成功,但此时索引是不能使用的,需要等待一段时间在后台创建索引,最好可以关注Index Store的变化,观察是否是在创建索引,如果Index Store的值不再增长,说明索引创建成功,此时需要重启一下库,索引才能生效。 img
作者:大飞飞飞飞飞
链接:https://zhuanlan.zhihu.com/p/60608481
参考
[1] https://zhuanlan.zhihu.com/p/66553466
[2] https://zhuanlan.zhihu.com/p/60608481
[3] neo4j官方手册
网友评论