信息发布→ 登录 注册 退出

SQL数据库索引选择性分析_区分度评估方法

发布时间:2026-01-10

点击量:
索引选择性是衡量索引过滤效率的核心指标,计算为COUNT(DISTINCT column)/COUNT(*),≥0.1为良好,0.01~0.1需结合查询判断,

索引选择性(Selectivity)是衡量索引过滤效率的核心指标,本质是“索引列值越唯一,查询越快”。高选择性意味着该列能大幅缩小扫描范围;低选择性(如性别、状态字段)则可能让优化器放弃使用索引,甚至引发全表扫描。

选择性计算公式与阈值参考

选择性 = 去重值数量(COUNT(DISTINCT column)) / 总行数(COUNT(*))。结果介于 0 到 1 之间:

  • ≥ 0.1(10%):通常视为良好选择性,索引较有价值
  • 0.01 ~ 0.1:中等选择性,需结合查询模式判断(如常用于 WHERE + ORDER BY 组合)

避免常见误判:NULL 和重复分布的影响

直接套用公式可能失真,需关注数据实际分布:

  • 大量 NULL 值会拉低 DISTINCT 计数,但多数数据库对 NULL 索引处理特殊(如 B-Tree 默认不存 NULL),应单独统计非 NULL 行占比
  • 看似高选择性,但热点值(如 status=‘active’ 占 95%)会导致索引在多数查询中失效——建议用直方图或采样检查值频次分布
  • 时间类字段(如 create_time)整体选择性高,但按“最近7天”查询时有效选择性骤降,需结合业务时间窗口评估

组合索引的选择性评估策略

组合索引(A, B, C)不是简单叠加,而是按最左前缀逐级收敛:

  • 先算 A 的选择性;若不足,再看 A+B 的联合去重率(COUNT(DISTINCT A, B)/COUNT(*))
  • 真正有效的组合索引,往往要求前导列(A)有中等以上选择性,且后缀列(B/C)能在前导列基础上显著提升过滤能力
  • 用 EXPLAIN 验证:对比单列索引与组合索引的 key_len 和 rows,rows 显著减少才说明组合生效

实战建议:从查询驱动反推索引价值

脱离 WHERE 条件谈选择性没有意义。推荐三步法:

  • 抓取慢查询日志,提取高频 WHERE、JOIN、ORDER BY 涉及的列
  • 对这些列分别执行选择性计算,并按查询谓词(=、IN、BETWEEN、LIKE 'abc%')分类验证有效性
  • 用 FORCE INDEX 或索引提示临时启用索引,观察执行计划中的 type(最好为 ref/const)、rows、Extra(避免 Using filesort/Using temporary)
标签:# 基础上  # 计算公式  # 并按  # 越快  # 若不  # 则可  # 有价值  # 再看  # 能让  # 能在  # ai  # 数据库  # column  # using  # const  # count  # NULL  # sql  # 热点  
在线客服
服务热线

服务热线

4008888355

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!