SQLite Tags Benchmark
内容简介
对比了5种不同的SQLite标签存储策略,通过实际基准测试揭示了各方案在查询速度、存储空间和实现复杂度之间的权衡。
测试参数
| 参数 | 值 |
|---|---|
| 数据行数 | 100,000 |
| 标签词汇量 | 100个唯一标签 |
| 每行标签数 | 3-10个(平均6.5) |
| 每标签平均行数 | ~6,498 (6.5%) |
| 查询迭代次数 | 每查询100次,10种不同标签组合 |
查询性能对比 (ms)
| 策略 | 单标签 | AND (2标签) | OR (2-5标签) |
|---|---|---|---|
| JSON + Lookup | 1.37 | 1.88 | 11.02 |
| M2M Tables | 1.41 | 2.26 | 10.69 |
| FTS5 | 3.28 | 2.59 | 13.54 |
| LIKE | 19.45 | 19.41 | 57.94 |
| JSON (no index) | 54.98 | 54.63 | 84.24 |
存储空间对比
| 策略 | 存储 (KB) | 初始化时间 (ms) |
|---|---|---|
| FTS5 | 7,044 | 267 |
| LIKE | 7,244 | 167 |
| M2M Tables | 8,772 | 1,313 |
| JSON (no index) | 9,124 | 295 |
| JSON + Lookup | 20,344 | 1,002 |
各策略优缺点
JSON + Lookup (推荐)
✓ 查询速度快 (1.4ms)
✓ 保持JSON列用于API响应
✗ 存储空间翻倍 (20MB)
✗ 需要同步lookup表
M2M Tables (经典方案)
✓ 查询速度快 (1.4ms)
✓ 存储合理 (8.7MB)
✓ 成熟稳定,可预测
✗ 实现复杂,需要3张表
FTS5
✓ 最小的存储空间 (7MB)
✓ AND查询仅2.6ms
✗ 标记化风险(空格/标点)
✗ 需要注意查询语法
LIKE
✓ 实现极其简单
✗ 性能一般 (19ms)
✗ 慢于索引方案14倍
JSON (no index)
✓ 实现简单
✗ 不适合查询,最慢 (55ms)
使用建议
- 通用生产环境: M2M Tables
- 搜索导向应用: FTS5
- 需要JSON API + 快速查询: JSON + Lookup
- 小数据集,简单代码: LIKE
- 绝对不要用于查询: Raw JSON
核心结论
Indexed approaches (Materialized Lookup Tables 和 Classic M2M) 轻松超越其他方案,单标签查询在1.5ms内完成。Raw JSON 和 LIKE 方案在大数据集上表现不佳。