Heim > Datenbank > MySQL-Tutorial > Hauptteil

浅析MySQL存储引擎中的索引

青灯夜游
Freigeben: 2021-11-02 11:27:14
nach vorne
1338 人浏览过

本篇文章和大家聊聊MySQL存储引擎中索引如何落地,希望对大家有所帮助!

浅析MySQL存储引擎中的索引

我们知道不同的存储引擎文件是不一样,我们可以查看数据文件目录:

show VARIABLES LIKE 'datadir';
Nach dem Login kopieren

每 张 InnoDB 的 表 有 两 个 文 件 ( .frm 和 .ibd ),MyISAM 的 表 有 三 个 文 件 (.frm、.MYD、.MYI)。【相关推荐:mysql视频教程

有一个是相同的文件,.frm .frm是 MySQL 里面表结构定义的文件,不管你建表的时候选用任何一个存储引擎都会生成,我们就不看了。

我们主要看一下其他两个文件是怎么实现 MySQL 不同的存储引擎的索引的。

我们先来看下 MyISAM。

MyISAM

在 MyISAM 里面,另外有两个文件:

一个是.MYD文件,D 代表 Data,是 MyISAM 的数据文件,存放数据记录,比如我们的 user_myisam 表的所有的表数据。

一个是.MYI 文件,I 代表 Index,是 MyISAM 的索引文件,存放索引,比如我们在 id 字段上面创建了一个主键索引,那么主键索引就是在这个索引文件里面。

也就是说,在 MyISAM 里面,索引和数据是两个独立的文件。那我们怎么根据索引找到数据呢?

MyISAM 的 B+Tree 里面,叶子节点存储的是数据文件对应的磁盘地址。所以从索引文件.MYI 中找到键值后,会到数据文件.MYD 中获取相应的数据记录。

1.png

这里画的是主键索引,如果是辅助索引,有什么不一样呢?

在 MyISAM 里面,辅助索引也在这个.MYI 文件里面。 辅助索引跟主键索引存储和检索数据的方式是没有任何区别的,一样是在索引文件里面找到磁盘地址,然后到数据文件里面获取数据。

2.png

InnoDB

InnoDB 只有一个文件(.ibd 文件),那索引放在哪里呢?

在 InnoDB 里面,它是以主键为索引来组织数据的存储的,所以索引文件和数据文件是同一个文件,都在.ibd 文件里面。

在 InnoDB 的主键索引的叶子节点上,它直接存储了我们的数据。

3.png

什么叫做聚集索引(聚簇索引)?

就是索引键值的逻辑顺序跟表数据行的物理存储顺序是一致的。(比如字典的目录是按拼音排序的,内容也是按拼音排序的,按拼音排序的这种目录就叫聚集索引)。

在 InnoDB 里面,它组织数据的方式叫做叫做(聚集)索引组织表(clustered index organize table),所以主键索引是聚集索引,非主键都是非聚集索引。

主键之外的索引,比如我们在 name 字段上面建的普通索引,又是怎么存储和检索数据的呢?

4.png

InnoDB 中,主键索引和辅助索引是有一个主次之分的。

辅助索引存储的是辅助索引和主键值。如果使用辅助索引查询,会根据主键值在主键索引中查询,最终取得数据。

比如我们用 name 索引查询 name= '青山',它会在叶子节点找到主键值,也就是 id=1,然后再到主键索引的叶子节点拿到数据。

另一个问题,如果一张表没有主键怎么办?

1、如果我们定义了主键(PRIMARY KEY),那么 InnoDB 会选择主键作为聚集索引。

2、如果没有显式定义主键,则 InnoDB 会选择第一个不包含有 NULL 值的唯一索引作为主键索引。

3、如果也没有这样的唯一索引,则 InnoDB 会选择内置 6 字节长的 ROWID 作为隐藏的聚集索引,它会随着行记录的写入而主键递增。

select _rowid name from t2;
Nach dem Login kopieren

所以呢?不会存在没有主键的表。

小结

通过以上的分析,我们知道在 MyISAM 和 InnoDB 这两大存储引擎中,索引的具体落地形式是怎么样的。

更多编程相关知识,请访问:编程入门!!

以上是浅析MySQL存储引擎中的索引的详细内容。更多信息请关注PHP中文网其他相关文章!

Verwandte Etiketten:
Quelle:juejin.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!