Appearance
索引与约束
创建索引
基本语法
cypher
// 创建单属性索引
CREATE INDEX [索引名称] FOR (n:标签) ON (n.属性)
// 创建复合索引
CREATE INDEX [索引名称] FOR (n:标签) ON (n.属性1, n.属性2)示例
创建单属性索引
cypher// 为 Person 节点的 name 属性创建索引 CREATE INDEX FOR (n:Person) ON (n.name) // 为 Person 节点的 age 属性创建索引 CREATE INDEX FOR (n:Person) ON (n.age)创建复合索引
cypher// 为 Person 节点的 name 和 age 属性创建复合索引 CREATE INDEX FOR (n:Person) ON (n.name, n.age)创建命名索引
cypher// 创建命名索引 CREATE INDEX person_name_index FOR (n:Person) ON (n.name)创建全文索引
cypher// 创建全文索引 CREATE FULLTEXT INDEX person_fulltext_index FOR (n:Person) ON EACH [n.name, n.bio]
创建唯一约束
基本语法
cypher
CREATE CONSTRAINT [约束名称] FOR (n:标签) REQUIRE n.属性 IS UNIQUE示例
创建唯一约束
cypher// 为 Person 节点的 email 属性创建唯一约束 CREATE CONSTRAINT FOR (n:Person) REQUIRE n.email IS UNIQUE // 为 Company 节点的 name 属性创建唯一约束 CREATE CONSTRAINT FOR (n:Company) REQUIRE n.name IS UNIQUE创建命名唯一约束
cypher// 创建命名唯一约束 CREATE CONSTRAINT person_email_unique FOR (n:Person) REQUIRE n.email IS UNIQUE
创建存在约束
基本语法
cypher
CREATE CONSTRAINT [约束名称] FOR (n:标签) REQUIRE n.属性 IS NOT NULL示例
创建存在约束
cypher// 为 Person 节点的 name 属性创建存在约束 CREATE CONSTRAINT FOR (n:Person) REQUIRE n.name IS NOT NULL // 为 Company 节点的 name 属性创建存在约束 CREATE CONSTRAINT FOR (n:Company) REQUIRE n.name IS NOT NULL创建命名存在约束
cypher// 创建命名存在约束 CREATE CONSTRAINT person_name_not_null FOR (n:Person) REQUIRE n.name IS NOT NULL
索引使用最佳实践
1. 何时使用索引
- 频繁查询的属性:对于经常用于 WHERE 子句的属性
- 唯一标识属性:如 ID、邮箱等
- 排序操作:对于经常用于 ORDER BY 的属性
- 范围查询:对于经常用于范围查询的属性
2. 索引类型选择
- 单属性索引:适用于单个属性的查询
- 复合索引:适用于多个属性的组合查询
- 全文索引:适用于文本搜索
3. 索引维护
- 监控索引状态:使用
SHOW INDEXES命令查看索引状态 - 重建索引:当数据量变化较大时,考虑重建索引
- 删除不需要的索引:避免维护不必要的索引
4. 性能考虑
- 索引大小:索引会占用存储空间,需要权衡
- 写入性能:索引会影响写入性能,需要平衡
- 查询性能:索引可以显著提高查询性能
管理索引与约束
1. 查看索引
cypher
// 查看所有索引
SHOW INDEXES
// 查看特定标签的索引
SHOW INDEXES WHERE labels = ['Person']2. 查看约束
cypher
// 查看所有约束
SHOW CONSTRAINTS
// 查看特定标签的约束
SHOW CONSTRAINTS WHERE labels = ['Person']3. 删除索引
cypher
// 删除索引
DROP INDEX FOR (n:Person) ON (n.name)
// 删除命名索引
DROP INDEX person_name_index4. 删除约束
cypher
// 删除唯一约束
DROP CONSTRAINT FOR (n:Person) REQUIRE n.email IS UNIQUE
// 删除存在约束
DROP CONSTRAINT FOR (n:Person) REQUIRE n.name IS NOT NULL
// 删除命名约束
DROP CONSTRAINT person_email_unique示例:使用索引优化查询
未使用索引的查询
cypher
// 未使用索引的查询
MATCH (p:Person)
WHERE p.name = 'John'
RETURN p使用索引的查询
cypher
// 先创建索引
CREATE INDEX FOR (n:Person) ON (n.name)
// 使用索引的查询
MATCH (p:Person {name: 'John'})
RETURN p复合索引查询
cypher
// 创建复合索引
CREATE INDEX FOR (n:Person) ON (n.name, n.age)
// 使用复合索引的查询
MATCH (p:Person)
WHERE p.name = 'John' AND p.age = 30
RETURN p小结
索引与约束是优化 Neo4j 查询性能的重要手段。通过创建合适的索引,可以显著提高查询速度;通过创建约束,可以保证数据的完整性和一致性。在实际应用中,需要根据具体的查询模式和数据特点,合理设计和使用索引与约束。
在接下来的章节中,我们将介绍事务管理,这是保证数据一致性和可靠性的重要机制。