
在MySQL中,不同存储引擎对索引的实现方式是不同的,Mysql常有MyISAM和InnoDB两个存储引擎的索引实现方式,MySQL5.5以后默认使用InnoDB存储引擎,其中InnoDB和BDB提供事务安全表,其它存储引擎都是非事务安全表。下面就来分别介绍这两种存储引擎。
MyISAM
在MyISAM储存引擎中,数据和索引文件是分开储存的,所以在索引树中的叶子节点中存的数据是该索引对应的数据记录的地址,由于数据与索引不在一起,所以 Myisam 是非聚簇索引。
Myisam 的存储文件有三个,后缀名分别是 .frm、.MYD、MYI,其中 .frm 是表的定义文件,.MYD 是数据文件,.MYI 是索引文件。
Myisam 只支持表锁,且不支持事务。由于有单独的索引文件,在读取数据方面的性能很高 。
Myisam 也是B+树结构,但是MyISAM索引的叶子节点的数据保存的是行数据的地址。因此,MyISAM中索引检索的算法首先在索引树中找到行数据的地址,然后根据地址找到对应的行数据。如果要保证 MyISAM 的数据一致性,那我们需要在表级别上进行加锁处理
可以看出MyISAM的索引文件仅仅保存数据记录的地址。主键索引和辅助索引,只是主索引要求key是唯一的,而辅助索引的key可以重复。如果我们在Col2上建立一个辅助索引,则此索引的如下图:
MyISAM的索引方式也叫做“非聚集(非聚簇)”的,之所以这么称呼是为了与InnoDB的聚集索引区分。
InnoDB
在InnoDB中,数据和索引文件是合起来储存的,一个定义文件,一个是数据文件。 InnoDB 通过 B+Tree 结构对 ID 建索引,然后在叶子节点中存储记录,叫作聚集索引。由于数据直接就存在索引的叶子节点中,因此 InnoDB 不需要给全表加锁来保证一致性,它只需要支持行级的锁就可以了。
如图所示,InnoDB 的存储文件有两个,后缀名分别是.frm 和.idb,其中.frm 是表的定义文件,而 idb 是数据文件。
在InnoDB虽然底层也是B+树实现的方式,但是与MyISAM却有明显的区别,在InnoDB实现的索引结构中,索引文件和数据文件是一起的,InnoDB中索引文件中的key就是数据表中的主键索引,因此InnoDB的索引文件也是主索引文件。如下图所示:
如果给另一个字段指定为普通索引,则普通索引树的结构如下图所示:
所以,当查询不是按照主键查询时候就会先在辅助索引树上先找到主键的值,然后再到主索引树找到对应的行数据的值,这叫做回表,回表降低了表的查询效率。
MyISAM索引与InnoDB索引的主要区别
- InnoDB索引是聚簇索引,MyISAM索引是非聚簇索引。
- InnoDB的主键索引的叶子节点存储着行数据,因此主键索引非常高效。
- MyISAM索引的叶子节点存储的是行数据地址,需要再寻址一次才能得到数据。
- InnoDB非主键索引的叶子节点存储的是主键和其他带索引的列数据,因此查询时做到覆盖索引会非常高效。
