文章目录
-
-
- [1. `Table`](#1.
Table) - [2. `Non_unique` ⭐ 核心](#2.
Non_unique⭐ 核心) - [3. `Key_name` ⭐ 核心](#3.
Key_name⭐ 核心) - [4. `Seq_in_index` ⭐ 核心](#4.
Seq_in_index⭐ 核心) - [5. `Column_name`](#5.
Column_name) - [6. `Collation`](#6.
Collation) - [7. `Cardinality` ⭐ 非常重要](#7.
Cardinality⭐ 非常重要) - [8. `Sub_part`](#8.
Sub_part) - [9. `Packed`](#9.
Packed) - [10. `Null`](#10.
Null) - [11. `Index_type`](#11.
Index_type) - [12. `Comment` / `Index_comment`](#12.
Comment/Index_comment)
- [1. `Table`](#1.
- 新手重点掌握清单
-

我结合你这张 employees 表的实际数据,从左到右逐列讲解,重点标出日常学习和优化必须掌握的核心列。
1. Table
- 含义:索引所属的表
- 这张表里全是
employees,说明,这些索引都属于员工表,单表查询时不用特别关注。
2. Non_unique ⭐ 核心
- 含义:索引是否允许重复值,是区分「普通索引」和「唯一 / 主键索引」的关键
- 取值:
- 0:不允许重复 → 主键索引 / 唯一索引
- 1:允许重复 → 普通索引
- 对应你的表:
PRIMARY、emp_email_uk、emp_emp_id_pk都是0→ 都是唯一索引emp_dept_fk、emp_job_fk、emp_manager_fk都是1→ 都是普通索引
3. Key_name ⭐ 核心
- 含义:索引的名称
- 关键点:
- 主键索引的名字固定叫
PRIMARY,所有表都一样 - 其他索引是建索引时自定义的名字(比如
emp_email_uk里的uk是唯一索引的命名惯例) - 同一个索引名出现几行,就说明这个索引包含几个字段
- 你表里每个索引名都只出现 1 行,说明这 6 个全都是单列索引,没有联合索引
- 主键索引的名字固定叫
4. Seq_in_index ⭐ 核心
- 含义:字段在索引中的顺序号,从 1 开始递增
- 这是判断联合索引字段顺序的唯一依据,直接对应「最左前缀匹配原则」
- 对应你的表:
- 所有行都是
1,说明每个索引都只有 1 个字段 - 如果是联合索引
idx_name_age(name, age),就会输出两行:Seq_in_index=1→name(第1个字段)Seq_in_index=2→age(第2个字段)
- 所有行都是
5. Column_name
- 含义:索引包含的具体字段名
- 比如第一行的
employee_id,就是主键索引对应的字段。
6. Collation
- 含义:索引的排序方式
- 取值:
A:升序(Ascending),InnoDB 默认都是 A,也就是 B+ 树里按从小到大排序NULL:无排序,非常少见
- 日常开发不用深究,知道默认是升序即可。
7. Cardinality ⭐ 非常重要
- 含义 :索引基数,代表索引中不重复值的估算数量
- 作用:判断索引的「区分度」,值越大,区分度越高,查询效率越好;值太小说明索引收益很低,甚至可能被优化器放弃。
- 对应你的表:
employee_id、email基数都是107,和表总行数基本一致 → 每个值都唯一,区分度拉满,查询效率最高department_id基数12→ 全表大概 12 个不同部门,区分度一般job_id、manager_id基数19→ 区分度中等
- 注意:这是估算值,不是精确数字,MySQL 会定期自动更新统计信息。
8. Sub_part
- 含义:前缀索引的长度
- 取值:
NULL:普通索引,对字段的完整内容建索引- 数字(比如 10):前缀索引,只对字段的前 10 个字符建索引,用于长字符串节省空间
- 你表里全是
NULL,说明都是全字段索引,没有前缀索引。
9. Packed
- 含义:索引的压缩方式
- 日常开发基本不用管,InnoDB 下一般都是
NULL,老引擎 MyISAM 用得较多。
10. Null
- 含义:该字段是否允许存储 NULL 值
- 取值:
YES:允许为 NULL- 空白:不允许为 NULL
- 对应你的表:
department_id、manager_id显示YES→ 允许为空- 主键、邮箱等字段空白 → 不允许为空
11. Index_type
- 含义:索引的底层类型
- 你表里全是
BTREE,也就是 B+ 树索引,是 InnoDB 默认、也是最常用的索引类型。 - 其他少见类型:
FULLTEXT(全文索引)、HASH(哈希索引)。
12. Comment / Index_comment
- 含义:索引的备注说明
- 一般都是空的,建索引时可以自己加注释,方便后续维护。
新手重点掌握清单
不用全背,记住这 5 列就足够应对 90% 的场景:
- Key_name:有哪些索引,叫什么名字
- Seq_in_index:联合索引的字段顺序
- Column_name:索引对应哪个字段
- Non_unique:是普通索引还是唯一索引
- Cardinality:索引区分度高不高,值不值得用
另外补充一句:你表里的 emp_emp_id_pk 和 PRIMARY 字段相同、都是唯一索引,属于完全冗余的索引,实际开发中可以直接删掉,不会影响任何查询性能。