MysqL 索引的列 都是什么意思

文章目录

      • [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)
    • 新手重点掌握清单

我结合你这张 employees 表的实际数据,从左到右逐列讲解,重点标出日常学习和优化必须掌握的核心列。


1. Table

  • 含义:索引所属的表
  • 这张表里全是 employees,说明,这些索引都属于员工表,单表查询时不用特别关注。

2. Non_unique ⭐ 核心

  • 含义:索引是否允许重复值,是区分「普通索引」和「唯一 / 主键索引」的关键
  • 取值:
    • 0:不允许重复 → 主键索引 / 唯一索引
    • 1:允许重复 → 普通索引
  • 对应你的表:
    • PRIMARYemp_email_ukemp_emp_id_pk 都是 0 → 都是唯一索引
    • emp_dept_fkemp_job_fkemp_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=1name(第1个字段)
      • Seq_in_index=2age(第2个字段)

5. Column_name

  • 含义:索引包含的具体字段名
  • 比如第一行的 employee_id,就是主键索引对应的字段。

6. Collation

  • 含义:索引的排序方式
  • 取值:
    • A:升序(Ascending),InnoDB 默认都是 A,也就是 B+ 树里按从小到大排序
    • NULL:无排序,非常少见
  • 日常开发不用深究,知道默认是升序即可。

7. Cardinality ⭐ 非常重要

  • 含义 :索引基数,代表索引中不重复值的估算数量
  • 作用:判断索引的「区分度」,值越大,区分度越高,查询效率越好;值太小说明索引收益很低,甚至可能被优化器放弃。
  • 对应你的表:
    • employee_idemail 基数都是 107,和表总行数基本一致 → 每个值都唯一,区分度拉满,查询效率最高
    • department_id 基数 12 → 全表大概 12 个不同部门,区分度一般
    • job_idmanager_id 基数 19 → 区分度中等
  • 注意:这是估算值,不是精确数字,MySQL 会定期自动更新统计信息。

8. Sub_part

  • 含义:前缀索引的长度
  • 取值:
    • NULL:普通索引,对字段的完整内容建索引
    • 数字(比如 10):前缀索引,只对字段的前 10 个字符建索引,用于长字符串节省空间
  • 你表里全是 NULL,说明都是全字段索引,没有前缀索引。

9. Packed

  • 含义:索引的压缩方式
  • 日常开发基本不用管,InnoDB 下一般都是 NULL,老引擎 MyISAM 用得较多。

10. Null

  • 含义:该字段是否允许存储 NULL 值
  • 取值:
    • YES:允许为 NULL
    • 空白:不允许为 NULL
  • 对应你的表:
    • department_idmanager_id 显示 YES → 允许为空
    • 主键、邮箱等字段空白 → 不允许为空

11. Index_type

  • 含义:索引的底层类型
  • 你表里全是 BTREE,也就是 B+ 树索引,是 InnoDB 默认、也是最常用的索引类型。
  • 其他少见类型:FULLTEXT(全文索引)、HASH(哈希索引)。

12. Comment / Index_comment

  • 含义:索引的备注说明
  • 一般都是空的,建索引时可以自己加注释,方便后续维护。

新手重点掌握清单

不用全背,记住这 5 列就足够应对 90% 的场景:

  1. Key_name:有哪些索引,叫什么名字
  2. Seq_in_index:联合索引的字段顺序
  3. Column_name:索引对应哪个字段
  4. Non_unique:是普通索引还是唯一索引
  5. Cardinality:索引区分度高不高,值不值得用

另外补充一句:你表里的 emp_emp_id_pkPRIMARY 字段相同、都是唯一索引,属于完全冗余的索引,实际开发中可以直接删掉,不会影响任何查询性能。

相关推荐
秋风渡.3 小时前
MySQL_数据类型知识
数据库·mysql
一嘴一个橘子5 小时前
MysqL 主键索引 就是 聚簇索引 吗
mysql
Whyn5 小时前
MySQL 学习笔记(二)
mysql
raindayinrain6 小时前
mysql原理--补充
数据库·mysql
NWU_白杨8 小时前
三种常用的数据存储技术
数据库·redis·mysql·sqlite
一嘴一个橘子9 小时前
MySqL 的 B+树、 叶子节点、非叶子节点
mysql
小飞侠在吗9 小时前
【MySQL 排错】Navicat 连接 localhost 报 2002 (10061) 完整排查记录(Windows + MySQL 8.4 用户模式)
windows·mysql·adb
夜雪一千10 小时前
MySQL查询条件的顺序是否影响查询效率
数据库·mysql
凤山老林11 小时前
MySQL“读已提交“并非万能药:深度解析RC隔离级别的盲区与适用边界
数据库·mysql