MyISAM与InnoDB索引方式

引言

MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。Myisam创建表生成三个文件:.frm 数据表结构.myd 数据文件.myi 索引文件。Innodb只生成一个.frm文件,数据存放在ibdata1.log。他们索引都是通过B+树实现的,只是实现的细节有所不同。

MyISAM索引实现

由于索引文件仅保存数据的地址,所以以MyISAM引擎的索引过程可以别描述为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。
索引可以分为主索引辅助索引(Secondary),区别仅仅在于主索引的key必须唯一,而辅助索引的key可以是重复的。
在这里插入图片描述
上图是这张表的B+树索引图结构,Col1(id)是主键,当它作为索引时,B+树的叶节点的data存储的是数据存储的物理地址。MyISAM的索引方式也叫做非聚集的。

InnoDB索引实现

InnoDB 也采用 B+Tree这种数据结构来实现 B-Tree索引。而很大的区别在于,InnoDB 存储引擎采用“聚集索引”的数据存储方式实现B-Tree索引,叶节点data域保存了完整的数据记录,数据行和相邻的键值紧凑地存储在一起所以被称之为聚焦索引
索引可以分为主索引(聚焦索引)辅助索引,他们的区别在于,主索引方式中B+树叶节点的data域存储的是完整的一条数据,而辅助索引中B+树叶节点的data域存储的是数据的主键值。
在这里插入图片描述
聚集索引这种实现方式使得按主键的搜索十分高效,但是注意 InnoDB 只能聚集一个叶子页(16K)的记录(即聚集索引满足一定的范围的记录),因此包含相邻键值的记录可能会相距甚远。(比如一页只能包含100条数据,那么这100条数据都是相邻的,但是第101条数据可能就不会在第100条数据后面)。
在这里插入图片描述
辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。所以不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。
在Innodb中也不建议使用非单调的字段作为主键,因为InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性(K[i]<K[i+1])而频繁的分裂调整,十分低效,建议使用自增字段作为主键。

两种引擎的选择

  • MyISAM不支持事务处理等高级功能,但它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。
  • InnoDB用于需要事务处理的应用程序,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。

参考资料

1.由浅入深理解InnoDB的索引实现
2.MySQL中MyISAM和InnoDB对B-Tree索引不同的实现方式
3. MySQL常见面试题

在突击找工作面试题时,写点心得,方便以后查看。

发布了11 篇原创文章 · 获赞 5 · 访问量 8095

猜你喜欢

转载自blog.csdn.net/baidu_36161424/article/details/104864043