Skip to content

索引与约束

创建索引

基本语法

cypher
// 创建单属性索引
CREATE INDEX [索引名称] FOR (n:标签) ON (n.属性)

// 创建复合索引
CREATE INDEX [索引名称] FOR (n:标签) ON (n.属性1, n.属性2)

示例

  1. 创建单属性索引

    cypher
    // 为 Person 节点的 name 属性创建索引
    CREATE INDEX FOR (n:Person) ON (n.name)
    
    // 为 Person 节点的 age 属性创建索引
    CREATE INDEX FOR (n:Person) ON (n.age)
  2. 创建复合索引

    cypher
    // 为 Person 节点的 name 和 age 属性创建复合索引
    CREATE INDEX FOR (n:Person) ON (n.name, n.age)
  3. 创建命名索引

    cypher
    // 创建命名索引
    CREATE INDEX person_name_index FOR (n:Person) ON (n.name)
  4. 创建全文索引

    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

示例

  1. 创建唯一约束

    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
  2. 创建命名唯一约束

    cypher
    // 创建命名唯一约束
    CREATE CONSTRAINT person_email_unique FOR (n:Person) REQUIRE n.email IS UNIQUE

创建存在约束

基本语法

cypher
CREATE CONSTRAINT [约束名称] FOR (n:标签) REQUIRE n.属性 IS NOT NULL

示例

  1. 创建存在约束

    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
  2. 创建命名存在约束

    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_index

4. 删除约束

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 查询性能的重要手段。通过创建合适的索引,可以显著提高查询速度;通过创建约束,可以保证数据的完整性和一致性。在实际应用中,需要根据具体的查询模式和数据特点,合理设计和使用索引与约束。

在接下来的章节中,我们将介绍事务管理,这是保证数据一致性和可靠性的重要机制。