zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

InnoDB 和 MyISAM 的索引

索引 InnoDB MyISAM
2023-09-14 09:11:21 时间

转自:https://blog.csdn.net/qq_39871711/article/details/105356927

1.索引组织

 InnoDB 是将索引和数据都存储到了一个文件中ibd类型,MyISAM 存储到了两个文件,MYD存储数据,MYI存储索引。

yISAM 引擎把数据和索引分开了,一人一个文件,这叫做非聚集索引方式;Innodb 引擎把数据和索引放在同一个文件里了,这叫做聚集索引方式。【??聚集和非聚集不是针对是否对主键来说的吗?】

从https://www.cnblogs.com/hld123/p/14749217.html文章中,聚集和非聚集,可以从物理存储或者逻辑角度俩看,这里说的聚集是指物理存储方式,而不是主键(逻辑角度)。

2.Innodb 引擎的底层实现(聚集索引方式)

 InnoDB 是聚集索引方式,因此数据和索引都存储在同一个文件里。

首先 InnoDB 会根据主键 ID 作为 KEY 建立索引 B+树,这是建表的时候 InnoDB 就会自动建立好主键 ID 索引树,这也是为什么 Mysql 在建表时要求必须指定主键的原因。

2.1 当我们为表里某个字段加索引时 InnoDB 会怎么建立索引树呢?如user_name ?

那么 InnoDB 就会建立 user_name 索引 B+树,节点里存的是 user_name 这个 KEY,叶子节点存储的数据的是主键 KEY。

拿到主键 KEY 后,InnoDB 才会去主键索引树里根据刚在 user_name 索引树找到的主键 KEY 查找到对应的数据。

2.2 为什么要多此一举?

InnoDB 需要节省存储空间。

一个表里可能有很多个索引,InnoDB 都会给每个加了索引的字段生成索引树,如果每个字段的索引树都存储了具体数据,那么这个表的索引数据文件就变得非常巨大(数据极度冗余了)。

3.MyISAM 引擎的底层实现(非聚集索引方式)

MyISAM 在建表时以主键作为 KEY 来建立主索引 B+树,树的叶子节点存的是对应数据的物理地址。我们拿到这个物理地址后,就可以到 MyISAM 数据文件中直接定位到具体的数据记录了。 

3.1 为字段添加索引?

当我们为某个字段添加索引时,我们同样会生成对应字段的索引树,该字段的索引树的叶子节点同样是记录了对应数据的物理地址,然后也是拿着这个物理地址去数据文件里定位到具体的数据记录。

4.什么字段适合添加索引?

  1. 较频繁的作为查询条件的字段应该创建索引;

  2. 唯一性太差的字段不适合单独创建索引,即使该字段频繁作为查询条件;

  3. 更新非常频繁的字段不适合创建索引。