SASI索引 #

一、SASI索引概述 #

1.1 什么是SASI #

SASI(SSTable Attached Secondary Index)是Cassandra的一种高性能二级索引实现。

text
SASI特点:

优点
├── 支持LIKE查询
├── 支持范围查询
├── 更高的写入性能
├── 更低的存储开销
└── 支持分词搜索

1.2 SASI vs 普通二级索引 #

特性 SASI 普通二级索引
LIKE查询
范围查询
写入性能
存储开销
分词搜索

二、创建SASI索引 #

2.1 基本创建 #

sql
-- 创建SASI索引
CREATE CUSTOM INDEX users_name_sasi_idx ON users (name)
USING 'org.apache.cassandra.index.sasi.SASIIndex';

-- 带选项创建
CREATE CUSTOM INDEX users_name_sasi_idx ON users (name)
USING 'org.apache.cassandra.index.sasi.SASIIndex'
WITH OPTIONS = {
    'mode': 'CONTAINS',
    'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.StandardAnalyzer',
    'case_sensitive': 'false'
};

2.2 索引模式 #

sql
-- PREFIX模式(前缀匹配)
CREATE CUSTOM INDEX users_name_prefix_idx ON users (name)
USING 'org.apache.cassandra.index.sasi.SASIIndex'
WITH OPTIONS = {'mode': 'PREFIX'};

-- CONTAINS模式(包含匹配)
CREATE CUSTOM INDEX users_name_contains_idx ON users (name)
USING 'org.apache.cassandra.index.sasi.SASIIndex'
WITH OPTIONS = {'mode': 'CONTAINS'};

-- SPARSE模式(稀疏索引,适合高基数)
CREATE CUSTOM INDEX users_id_sparse_idx ON users (user_id)
USING 'org.apache.cassandra.index.sasi.SASIIndex'
WITH OPTIONS = {'mode': 'SPARSE'};

2.3 分析器配置 #

sql
-- 标准分析器
CREATE CUSTOM INDEX users_name_idx ON users (name)
USING 'org.apache.cassandra.index.sasi.SASIIndex'
WITH OPTIONS = {
    'mode': 'CONTAINS',
    'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.StandardAnalyzer',
    'case_sensitive': 'false'
};

-- 非分词分析器
CREATE CUSTOM INDEX users_email_idx ON users (email)
USING 'org.apache.cassandra.index.sasi.SASIIndex'
WITH OPTIONS = {
    'mode': 'PREFIX',
    'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.NonTokenizingAnalyzer',
    'case_sensitive': 'false'
};

三、使用SASI索引 #

3.1 LIKE查询 #

sql
-- 前缀匹配
SELECT * FROM users WHERE name LIKE '张%';

-- 后缀匹配
SELECT * FROM users WHERE name LIKE '%三';

-- 包含匹配
SELECT * FROM users WHERE name LIKE '%张%';

-- 多条件组合
SELECT * FROM users 
WHERE name LIKE '%张%' 
AND age > 25;

3.2 范围查询 #

sql
-- 数值范围
SELECT * FROM products 
WHERE price > 100 AND price < 500;

-- 时间范围
SELECT * FROM events 
WHERE event_time >= '2024-01-01' 
AND event_time < '2024-02-01';

3.3 组合查询 #

sql
-- 组合多个条件
SELECT * FROM users 
WHERE name LIKE '%张%'
AND age >= 25
AND age <= 35;

四、SASI配置选项 #

4.1 模式选项 #

text
模式选项说明:

PREFIX
├── 前缀匹配
├── 支持 LIKE 'xxx%'
└── 适合前缀搜索

CONTAINS
├── 包含匹配
├── 支持 LIKE '%xxx%'
└── 适合全文搜索

SPARSE
├── 稀疏索引
├── 适合高基数列
└── 更高效的存储

4.2 分析器选项 #

text
分析器选项:

StandardAnalyzer
├── 分词处理
├── 支持多语言
└── 适合全文搜索

NonTokenizingAnalyzer
├── 不分词
├── 保持原值
└── 适合精确匹配

4.3 其他选项 #

sql
-- 完整配置示例
CREATE CUSTOM INDEX users_name_full_idx ON users (name)
USING 'org.apache.cassandra.index.sasi.SASIIndex'
WITH OPTIONS = {
    'mode': 'CONTAINS',
    'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.StandardAnalyzer',
    'case_sensitive': 'false',
    'tokenization_skip_stop_words': 'true',
    'tokenization_enable_stemming': 'true',
    'tokenization_normalize_whitespace': 'true'
};

五、性能考虑 #

5.1 写入性能 #

text
写入性能:

SASI
├── 写入时构建索引
├── 附加到SSTable
├── 开销较低
└── 比普通索引快

建议
├── 控制索引数量
├── 选择合适的模式
└── 监控写入延迟

5.2 查询性能 #

text
查询性能:

PREFIX模式
├── 性能最好
└── 索引高效

CONTAINS模式
├── 性能较好
└── 需要更多计算

SPARSE模式
├── 高基数列性能好
└── 存储效率高

六、最佳实践 #

6.1 使用建议 #

text
SASI使用建议:

适合场景
├── 需要LIKE查询
├── 需要范围查询
├── 中等基数列
└── 写入频繁场景

不适合场景
├── 极高基数列
├── 需要复杂搜索
└── 精确匹配为主

6.2 模式选择 #

text
模式选择指南:

前缀搜索 → PREFIX
全文搜索 → CONTAINS
高基数列 → SPARSE
精确匹配 → 普通二级索引

七、总结 #

SASI索引要点:

  1. LIKE支持:支持模糊查询
  2. 范围查询:支持数值和日期范围
  3. 三种模式:PREFIX、CONTAINS、SPARSE
  4. 分析器:支持分词和不分词
  5. 性能更好:比普通二级索引性能高
  6. 适用场景:需要模糊查询的场景

下一步,让我们学习物化视图!

最后更新:2026-03-27