Mysql——》Innodb存储引擎的索引

  • 一、文件
  • 二、聚集索引/聚簇索引/主键索引
  • 三、二级索引/辅助索引
  • 四、如果表中没有主键或者没有索引,数据存储在哪里?


一、文件

frm:表结构文件
ibd:数据即索引

Q:为什么说在 InnoDB 中索引即数据,数据即索引?
A:在 InnoDB 里面,它是以主键为索引来组织数据的存储的,所以索引文件和数据文件是同一个文
件,都在.ibd 文件里面。 在 InnoDB 的主键索引的叶子节点上,它直接存储了我们的数据。

Q:一张 InnoDB 的表可能有很多个多索引,数据肯定是只有一份的,那数据在哪个索引的叶子节点上呢?
A:存在聚集索引/聚簇索引上

二、聚集索引/聚簇索引/主键索引

如果一张表同时有主键索引和其它索引:
主键索引:就是聚集索引,决定数据行的物理存储顺序,叶子节点存储数据
其他索引:就是二级索引/辅助索引,叶子节点存储主键的值

定义:索引键值的逻辑顺序跟表数据行的物理存储顺序是一致的。

示例:字典的目录是按拼音排序的,内容也是按拼音排序的,按拼音排序的这种目录就叫聚集索引。

数据和索引使用不同表空间_数据和索引使用不同表空间

三、二级索引/辅助索引

当 我 们 用 name 索 引 查 询 一 条 记 录 , 它 会 在 二 级 索 引 的 叶 子 节 点 找 到name=bobo, 拿到主键值id=1,然后再到主键索引的叶子节点拿到数据。

从这个角度来说,因为主键索引比二级索引少扫描了一棵 B+Tree,它的速度相对会快一些。

数据和索引使用不同表空间_数据库_02

四、如果表中没有主键或者没有索引,数据存储在哪里?

参考链接:【官网】innodb-index-types

1、如果我们定义了主键(PRIMARY KEY),那么 InnoDB 会选择主键作为聚集索引。
2、如果没有显式定义主键,则 InnoDB 会选择第一个不包含有 NULL 值的唯一索引作为主键索
引。
3、如果也没有这样的唯一索引,则 InnoDB 会选择内置 6 字节长的 ROWID 作为隐藏的聚集索引,
它会随着行记录的写入而主键递增。