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

相关推荐
大梦想家a19 小时前
基于 Spring Boot 的物流运单管理系统后端设计与实现(JWT + MyBatis-Plus + MySQL)
spring boot·mysql·mybatis
云贝贝贝1 天前
腾讯云 TDSQL(MySQL 版)运维高频 6 坑:代理路由、读写分离、分片键、监控、PITR
运维·mysql·腾讯云
山岚的运维笔记1 天前
mysql 专业笔记 -- 第 8 章:使用变量
运维·数据库·笔记·后端·学习·mysql·dba
JavaPub-rodert2 天前
Redis 和 MySQL 如何保证数据一致性?从业务方案到底层原理完整讲解
数据库·redis·mysql
笑梦无境2 天前
mysql的安装及配置(3)
数据库·mysql·adb
Gent_倪2 天前
MySQL分库、分表、分区详解
数据库·mysql
Wang's Blog2 天前
Vibe Coding一人即团队系列54:云服务器 Node.js 与 MySQL 9 环境搭建及配置指南
服务器·人工智能·mysql·node.js
数智启示录2 天前
Apache Kafka 幂等 Producer 的边界:Exactly-Once 到了 MySQL 为什么失效 【Kafka合集】
数据库·经验分享·分布式·mysql·面试·kafka·apache
—Miss. Z—2 天前
计算机三级数据库技术—填空题
数据库·mysql
Gent_倪2 天前
MySQL 与 Hive 语法异同点详解
数据库·hive·mysql