转自:https://blog.csdn.net/qq_39871711/article/details/105356927
1.索引组织
InnoDB 是将索引和数据都存储到了一个文件中ibd类型,MyISAM 存储到了两个文件,MYD存储数据,MYI存储索引。
yISAM 引擎把数据和索引分开了,一人一个文件,这叫做非聚集索引方式;Innodb 引擎把数据和索引放在同一个文件里了,这叫做聚集索引方式。【??聚集和非聚集不是针对是否对主键来说的吗?】
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.什么字段适合添加索引?
-
较频繁的作为查询条件的字段应该创建索引;
-
唯一性太差的字段不适合单独创建索引,即使该字段频繁作为查询条件;
-
更新非常频繁的字段不适合创建索引。