SQLite Tags Benchmark

⭐⭐⭐⭐⭐ 5星 | 来源: Simon Willison Research | 2026-03-20

内容简介

对比了5种不同的SQLite标签存储策略,通过实际基准测试揭示了各方案在查询速度、存储空间和实现复杂度之间的权衡。

测试参数

参数
数据行数100,000
标签词汇量100个唯一标签
每行标签数3-10个(平均6.5)
每标签平均行数~6,498 (6.5%)
查询迭代次数每查询100次,10种不同标签组合

查询性能对比 (ms)

策略单标签AND (2标签)OR (2-5标签)
JSON + Lookup1.371.8811.02
M2M Tables1.412.2610.69
FTS53.282.5913.54
LIKE19.4519.4157.94
JSON (no index)54.9854.6384.24

存储空间对比

策略存储 (KB)初始化时间 (ms)
FTS57,044267
LIKE7,244167
M2M Tables8,7721,313
JSON (no index)9,124295
JSON + Lookup20,3441,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 方案在大数据集上表现不佳。