如何决定是否需要创建索引_数据区分度与基数Cardinality计算

索引是否有效取决于Cardinality值高低:接近总行数(≥95%)说明区分度高,适合建索引;<10%则单列索引意义不大;低区分度字段应置于联合索引后缀,如(created_at, status),并用EXPLAIN验证实际使用情况。索引有没有用,先看 Cardinality 值够不够高MySQL 的 SHOW INDEX FROM table_name 里那个 Cardinality 字段,不是"有多少行",而是"该列值大概有多少个不同取值"。它直接影响优化器是否愿意走索引。如果 Cardinality 只有几百,而表有百万行,那这个索引大概率被忽略------因为扫描索引再回表,比直接全表扫还慢。Cardinality 接近表总行数(比如 95% 以上),说明这列区分度高,适合建索引如果 Cardinality 小于总行数的 10%,基本可以判定:加单列索引意义不大注意:Cardinality 是采样估算值,执行 ANALYZE TABLE table_name 可刷新,但不会实时更新区分度低的字段硬加索引,反而拖慢写入比如 status 只有 'active'、'inactive'、'pending' 三个值,就算加上索引,查询时优化器大概率走全表扫描;更麻烦的是,每次 INSERT/UPDATE 都要维护这个索引 B+ 树,写放大明显。常见陷阱:给布尔型、枚举型、状态码字段单独建索引,却不结合查询条件中的其他过滤字段替代方案:把低区分度字段放在联合索引的**后缀位置**,比如 (created_at, status),靠前缀 created_at 拉高整体选择性验证方法:用 EXPLAIN 看 type 是否为 ref 或 range,而不是 ALL联合索引的顺序怎么排?看 WHERE 条件里的等值匹配和范围查询索引生效不只看有没有,更看字段在 WHERE 中的使用方式。MySQL 只能高效利用索引的最左前缀,一旦遇到范围查询(>、BETWEEN、LIKE 'abc%'),后面的字段就失效了。 文小言 百度旗下新搜索智能助手,有问题,问小言。

相关推荐
2301_7756398920 小时前
mysql修改字段长度是否影响数据_隐式转换与字符集限制分析
jvm·数据库·python
无心水20 小时前
【Hermes:MCP 与工具实战】29、数据库 MCP 实战:MySQL/PostgreSQL/SQLite 自然语言查询
数据库·mysql·postgresql·openclaw·养龙虾·hermes·honcho
Dshuishui20 小时前
我用 Claude Code 做了一个学术论文搜索工具
开发语言·人工智能·python·pip·uv
ㄟ留恋さ寂寞20 小时前
怎样修改提示“表已空”的空状态界面_Empty State插画替换
jvm·数据库·python
研究点啥好呢20 小时前
Momenta后端开发面试题精选:10道高频考题+答案解析(数据产线方向)
c++·python·面试·求职招聘
老歌老听老掉牙20 小时前
空间点到平面的距离:几何意义与计算方法
python·平面
m0_5913647321 小时前
SQL提升开发效率_使用CTE重构嵌套子查询逻辑
jvm·数据库·python
Elnaij21 小时前
MySQL数据库入门到进阶!!(1)——在云服务器中安装MySQL(centos)
数据库·mysql
2401_8314194421 小时前
JavaScript 中实现基于分组的前端产品筛选功能
jvm·数据库·python
曲幽21 小时前
初探:用 FastAPI 搭建你的第一个 AI Agent 接口
python·ai·llm·agent·fastapi·web·chat·httpx·ollama