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索引要点:
- LIKE支持:支持模糊查询
- 范围查询:支持数值和日期范围
- 三种模式:PREFIX、CONTAINS、SPARSE
- 分析器:支持分词和不分词
- 性能更好:比普通二级索引性能高
- 适用场景:需要模糊查询的场景
下一步,让我们学习物化视图!
最后更新:2026-03-27