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 字段相同、都是唯一索引,属于完全冗余的索引,实际开发中可以直接删掉,不会影响任何查询性能。

相关推荐
这个DBA有点耶44 分钟前
迁移中的数据一致性挑战:如何确保百万行数据“搬得对”
mysql·架构·dba
哦虎!1 小时前
【数据库】事务
java·数据库·mysql
Mico184 小时前
麒麟v10-MySQL InnoDB Cluster 完整部署与全场景验证(从入门到精通)
数据库·mysql
杨云龙UP4 小时前
生产环境MySQL多实例XtraBackup全量备份与rsync异地自动传输实践
linux·运维·数据库·mysql·xtrabackup·主从复制·备份恢复
会编程的吕洞宾5 小时前
MySQL 慢查询从5秒到50毫秒:索引失效六大场景定位与实战调优
数据库·mysql
浅念-5 小时前
MySQL 索引底层完整详解|磁盘Page|B+树推导|聚簇非聚簇索引|索引SQL操作
大数据·数据库·b树·sql·mysql·面试·职场和发展
Mico185 小时前
Percona Toolkit 3.5.7 完整实战笔记(从入门到精通)
mysql
梦想不只是梦与想6 小时前
MySQL 数据库(二):数据类型
数据库·mysql·数据类型
jason.zeng@15022077 小时前
服务器磁盘读写效率,网络吞吐量查看,mysql性能调优
服务器·网络·mysql
01_ice8 小时前
MySQL基本查询1
数据库·mysql