mysql聚集索引 myisam_一句话说清聚集索引和非聚集索引以及MySQL的InnoDB和MyISAM

本文深入解析了MySQL中InnoDB和MyISAM存储引擎的索引差异,包括聚集索引与非聚集索引的概念,并通过图表直观展示了两者数据存储的差异。建议使用MySQL5.6及以上版本时选择InnoDB。InnoDB的主键索引存储全部数据,而MyISAM存储数据地址。此外,还介绍了二级索引在两种引擎中的实现方式。
摘要由CSDN通过智能技术生成

版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/21aspnet/article/details/89303988

聚集索引和非聚集索引以及MySQL的InnoDB和MyISAM经常遇到有人向我咨询这个问题,其实呢,网上帖子很多,也说的都对,但是呢,看客可不一定是真的理解了。所以今天在这里用最简短的语言让你明白这些区别。

看这种图表就一切都明白了:

存储引擎

索引类型

主键叶子节点

非主键叶子节点

MyISAM

非聚簇

数据地址

数据地址

InnoDB

聚簇

全部数据

主键值

key重复

不能

问题:InnoDB和MyISAM选那个?

MySQL5.6以后选InnoDB。

===========上面已经把这个高频问题说完了,下面是为了满足好学者所做的扩展=============

名词解释

Clustered Index:聚集索引,又称聚簇索引。

Nonclustered indexes:非聚集索引,又称非聚簇索引。

Secondary Key:二级索引,因为聚集索引只能有一个,所有同一个表其他字段只能是二级索引也就是非聚集索引。

看看经典著作《高性能MySQL(第3版)》关于聚簇索引的说明:

f87362dcb9e55855e99cdaed4984ca5b

再看看关于隐式创建聚簇索引的说明:

29cb978d4e02300d2e4d3c728445559d

关于二级索引:

2cc6441c13f519e3eee8ae39b404e212

MyISAM的数据分布:

5bca180867a83afeaed5ffb087046ff2

InnDB最关键的就是聚集索引叶子节点存所有的数据项,二级索引存的是主键值,而不是行指针,而MyISAM存的是行指针:

b3303d333a4ee6d4ffe5916537ddb276

下面是 InnoDB和MyISAM的索引数据存储分布,如图所示MyISAM是索引叶子节点有指针指向,而 InnoDB则直接存数据没用指针:

ae7c7fc7b274694b44d5924f5aae3fe3

下面这个帖子也是写的极好的 ,作者很会画图,整体还是没用超越《高性能MySQL(第3版)》,如果上面的还看不懂可以看看此贴--《MySQL索引背后的数据结构及算法原理》。

MyISAM索引实现

MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。下图是MyISAM索引的原理图:

2ca67d57eac66dca8768abe92bed77c8

8251763a4846288c2ad1c5a879925c27

InnoDB索引实现

虽然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。

第一个重大区别是InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。

bf4a1054a7628544a6f05d132c5cd590

第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址:

01ad325135a8c1650cc5221a67c1d198

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值