索引之innodb和myisam
innodb和myisam的diff:
参考文章:https://www.cnblogs.com/sfzlstudy/p/15944832.html
what:
myisam:
索引文件和数据文件是分开的。索引文件中叶子结点的data部分,仅仅是数据记录的地址。它的主索引和辅助索引在结构上没有区别,数据上主索引的key是唯一的,辅助索引上的key可以重复。
主索引:
是B+树,叶节点的data域存放的是数据记录的地址。结构如下图:
上图中Col1为主键,即该“Primary key”索引就是主索引。
辅助索引:
辅助索引和主索引结构没有区别,只是辅助索引的key可以重复。Col2上建立一个辅助索引,则此索引的结构如下图所示:
innodb:
主索引和数据文件是在一起的,即聚集索引。 辅助索引的叶子节点的data域存放的是主键值(即key)。辅助索引查询需要二次索引,即先辅助索引找到主键的key,然后到主索引中,再找对应的数据。
主索引:
InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。
InnoDB主索引(同时也是数据文件)的示意图,可以看到叶节点包含了完整的数据记录。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键。
辅助索引:
所有辅助索引都引用主键(key)作为data域。例如,下图为定义在Col3上的一个辅助索引:
特性:
1、主键Key尽量不要大。原因:所有的辅助索引都会引用主索引的key,如果主key设计的过大,那么辅助索引也会很大。
2、主键Key尽量单调。原因:InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效。因此使用自增字段作为主键则是一个很好的选择(默认id就是单增)。