【数据库】——MyISAM和InnoDB索引详解

在上一篇文章中,我们已经知道存储引擎是,数据操作和磁盘间的中间层,它规定了底层硬件的操作方式。选择的存储引擎的不同针对底层文件的操作不同。

当我们要在磁盘里查询数据的时候,采取何种方式来查找呢?我们知道顺序遍历时间复杂度O(n) 效率最低,查询密集型的数据库 O(n) 效率最低。

那么哪种方式查询数据库更好呢,在数据结构中我们知道二分查找O(log2 n)效率较高,多路查询时间复杂度O(logx n)效率更高, 但是前提是要数据排列有序。

紧接着,我们就要思考如何来排序的问题,如果把排序放在查询数据之前,那么时间复杂度为O(n)+O(logx n) 。因此应该插入的时候排序O(n),在查询的时候O(logx n),由此引出我们B+树。

一、MyISAM存储引擎

MyISAM是MySQL的默认存储引擎。MyISAM不支持事务、也不支持外键,他的优势是访问的速度快,对事物完整性没有要求或者以select、insert为主的应用基本上都可以使用这个引擎来创建表。

1、MyISAM索引实现

(1)主键索引
MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址,下图是MyISAM主键索引的原理图:
在这里插入图片描述
这里面的表一共有三列,假设col1为主键。从图可以看出MyISAM的索引文件仅仅保存数据记录的地址。数据可以随机或者离散的分布所以他是非聚集索引

(2)辅助索引
在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。如果我们在Col2上建立一个辅助索引,则此索引的结构如下图所示:
在这里插入图片描述
同样也是一颗B+Tree,data域保存数据记录的地址。因此,MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。

二、InonoDB存储引擎

1、InnoDB的特点

InonoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比MyISAM的存储引擎,InonoDB写的处理效率差一些,并且会占用更多的磁盘空间以保留数据和索引。

1、自动增长列
InonoDB表的自动增长列可以手工插入,但是插入的值如果是空或者0,则实际插入的将是自动增长后的值。
自动增长列必须是索引,如果是组合索引,也必须是组合索引的第一列,但是对于MyISAM表,自动增长列可以是组合索引的其他列,这样插入记录后,自动增长列是按照组合索引的前面几列进行排序后递增的。

2、外键约束
MySQL支持外键的存储引擎只有InonoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引。

2、InonoDB索引实现

(1)主键索引
表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。
在这里插入图片描述
是一个聚集索引,因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则mysql自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。

扫描二维码关注公众号,回复: 10096372 查看本文章

(2)辅助索引
InnoDB的所有辅助索引都引用主键作为data域。例如,下图为定义在Col3上的一个辅助索引:
在这里插入图片描述
聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。

一、MyISAM和InonoDB索引的区别

一是主索引的区别,InnoDB的数据文件本身就是索引文件。而MyISAM的索引和数据是分开的。

二是辅助索引的区别:InnoDB的辅助索引data域存储相应记录主键的值而不是地址。而MyISAM的辅助索引和主索引没有多大区别。

发布了62 篇原创文章 · 获赞 7 · 访问量 2555

猜你喜欢

转载自blog.csdn.net/qq_43412060/article/details/104827125