MySQL学习-MyISAM的索引

64 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第25天,点击查看活动详情

前言

上篇我们学习了MySQL中的InnoDB的索引之非聚簇索引与联合索引。有兴趣的小伙伴可以阅读(MySQL学习-非聚簇索引与联合索引)。
下面我们继续学习MySQL中的MyISAM的索引。

MyISAM的索引

B树索引适用存储引擎如表所示:

索引MyISAMInnoDBMemory
B树索引支持支持支持

即使多个存储引擎支持同一种类型的索引,但是他们的实现原理也是不同的。InnoDB和MyISAM默认的索引是B树索引,而Memory默认的索引是Hash索引。

MyISAM引擎使用B树作为索引结构,叶子节点的data域存放的是数据记录的地址。

MyISAM与InnoDB的对比

MyISAM的索引方式都是非聚簇的,与InnoDB包含一个聚簇索引是不同的。区别如下:

  • 在InnoDB存储引擎中,我们只需要根据主键值对聚簇索引进行一次查找就能找到对应的记录,而在MyISAM中却需要进行一次回表操作,意味着MyISAM中建立的索引相当于全部都是二级索引。
  • InnoDB的数据文件本身就是索引文件是一起的,而MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。
  • InnoDB的非聚簇索引data域存储相应记录的主键的值,而MyISAM索引记录的是地址。换句话说,InnoDB的所有非聚簇索引都引用主键作为data域。
  • MyISAM的回表操作是十分快速的,因为是拿着地址偏移量直接到文件中取数据的,反观InnoDB是通过获取主键之后再去聚簇索引里找记录,虽然说也不慢,但还是比不上直接用地址去访问。
  • InnoDB要求表必须有主键(MyISAM可以没有)。如果没有显示指定,则MySQL系统会自动选择一个可以非空且唯一标识数据记录的列作为主键。如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为差长整型。

今天先学习到这里,明天继续