Apache Ignite SQL索引全面指南

Apache Ignite SQL索引全面指南

索引概述

在Apache Ignite分布式数据库中,索引是优化SQL查询性能的核心机制。Ignite提供了多种索引类型和配置方式,帮助开发者根据不同的业务场景构建高效的查询系统。

索引类型与创建方式

1. 自动创建索引

Ignite会自动为以下字段创建索引:

  • 主键字段(Primary Key)
  • 亲和键字段(Affinity Key)

这些基础索引为分布式查询提供了基本支持。

2. SQL命令创建索引

通过标准SQL DDL命令可以创建索引:

CREATE INDEX idx_name ON Person (name);

这种方式适合在运行时动态调整索引结构。

3. 注解方式配置索引

使用@QuerySqlField注解可以在Java类中声明式地定义索引:

public class Person {
    // 索引字段(默认升序)
    @QuerySqlField(index = true)
    private long id;
    
    // 指定降序索引
    @QuerySqlField(index = true, descending = true)
    private double salary;
    
    // 可查询字段(非索引)
    @QuerySqlField
    private String name;
    
    // 非查询字段
    private int age;
}

4. QueryEntity配置索引

通过Spring XML或编程方式使用QueryEntity配置:


    
        
            
                
                
                
                    
                        
                        
                    
                
                
                    
                        
                            
                        
                    
                
            
        
    

高级索引特性

1. 嵌套对象索引

Ignite支持对嵌套对象的字段建立索引:

public class Person {
    @QuerySqlField(index = true)
    private Address address;
}

public class Address {
    @QuerySqlField(index = true)
    private String street;
}

查询时可以直接使用嵌套字段:

SELECT * FROM Person WHERE street = 'Main St'

2. 组合索引(Group Indexes)

对于多条件查询,可以创建组合索引:

public class Person {
    @QuerySqlField(orderedGroups = {
        @QuerySqlField.Group(name = "age_salary_idx", order = 0, descending = true),
        @QuerySqlField.Group(name = "age_salary_idx", order = 3)
    })
    private int age;
    
    @QuerySqlField(index = true, orderedGroups = @QuerySqlField.Group(name = "age_salary_idx", order = 3))
    private double salary;
}

3. 索引内联大小优化

合理设置索引内联大小可以显著提升查询性能:

// 注解方式设置
@QuerySqlField(index = true, inlineSize = 15)
private String country;

// QueryEntity方式设置
new QueryIndex("country", false, "country_idx", 15L)

索引注册与使用

定义索引后,需要在缓存配置中注册索引类型:

CacheConfiguration cfg = new CacheConfiguration<>("personCache");
cfg.setIndexedTypes(Long.class, Person.class);

特殊字段说明

每个表自动包含两个特殊字段:

  • _key:引用整个键对象
  • _val:引用整个值对象

可用于原始类型查询:

SELECT * FROM Person WHERE _key = 100

自定义键类型索引

当使用复杂自定义键类型时,需要特别配置:

QueryEntity entity = new QueryEntity();
entity.setKeyFields(Set.of("id", "departmentId"));

最佳实践建议

  1. 索引选择性:高选择性的字段更适合建立索引
  2. 组合索引顺序:将最常用的查询条件放在组合索引前面
  3. 内联大小:对变长字段(如字符串)特别关注内联大小设置
  4. 索引维护成本:过多的索引会影响写入性能,需平衡读写需求

通过合理利用Ignite的索引功能,可以显著提升分布式环境下的SQL查询性能,满足各种复杂业务场景的需求。

你可能感兴趣的:(Apache Ignite SQL索引全面指南)