image.png MyISAM的索引文件仅仅保存数据记录地址。

MyISAM 与 InnoDB对比

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

小结:了解不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助。
例1:知道了InnoDB的索引实现后,就很容易明白为什么不建议使用过长的字段作为主键,因为所有二级索引都引用主键索引,过长的主键索引会引起二级索引变得过大,容量相对于变少。
例2:用非调的字段作为主键在InnoDB中不是好主意,因为InnoDB数据文件本身是棵B+Tree,非单调主键会早成在插入新纪录时,数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效。而使用自增字段作为主键是一个很好的选择。

索引的代价:
空间上的代价:每建立一个索引都要为它建立一颗B+树,每一棵B+树的每一个节点都是一个数据页,一个页默认占用16KB的存储空间,一颗很大的B+树由许多数据页组成,那就是很大一片存储空间。
时间上的代价:增、删、改的时候会进行记录移位、页面分裂、页面回收等操作。
为了能建立又好又少的索引,要学学这些索引在哪些条件下是起作用的。