首页/数据/SQL 速查/前缀索引:长字符串列的折中
性能与执行计划72 条

前缀索引:长字符串列的折中

长字符串列只索引前 N 个字符:减小索引体积,但无法覆盖查询,也不能完全替代整列排序用途。

SQL 速查数据更新于 2026-10-12

示例

示例
-- 用区分度选长度
SELECT COUNT(DISTINCT LEFT(url, 10)) / COUNT(*) AS sel10,
       COUNT(DISTINCT LEFT(url, 20)) / COUNT(*) AS sel20,
       COUNT(DISTINCT url) / COUNT(*)             AS sel_full
FROM pages;

ALTER TABLE pages ADD INDEX idx_url20 (url(20));

EXPLAIN SELECT id FROM pages WHERE url = 'https://example.com/a';
-- key: idx_url20;先定位候选再回表核对完整值
区分度N 越大区分度越高、索引越大;常用 10/20/50 做对比
限制前缀索引不能用于覆盖索引,也不能完整支撑 ORDER BY
PostgreSQL无前缀索引语法;普通 B 树可处理前缀匹配,长文本模糊匹配可借助 pg_trgm

易错点

  • 随手选前缀长度:先用 COUNT(DISTINCT LEFT(...)) 对比区分度,再定长度
  • 指望前缀索引覆盖查询:前缀截断后仍需回表核对完整值

数据来源与参考

  • MySQL 8.0 Reference Manual §8.3.5 Column Prefixes
  • PostgreSQL Documentation · pg_trgm
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌