一句话说清聚集索引和非聚集索引以及MySQL的InnoDB和MyISAM
聚集索引和非聚集索引以及MySQL的InnoDB和MyISAM经常遇到有人向我咨询这个问题,其实呢,网上帖子很多,也说的都对,但是呢,看客可不一定是真的理解了。所以今天在这里用最简短的语言让你明白这些区别。
看这种图表就一切都明白了:
存储引擎 | 索引类型 | 主键叶子节点 | 非主键叶子节点 |
MyISAM | 非聚簇 | 数据地址 | 数据地址 |
InnoDB | 聚簇 | 全部数据 | 主键值 |
key重复 | 不能 | 能 |
问题:InnoDB和MyISAM选那个?
MySQL5.6以后选InnoDB。
看看官方文档是最权威的:https://dev.mysql.com/doc/refman/5.7/en/innodb-benefits.html
===========上面已经把这个高频问题说完了,下面是为了满足好学者所做的扩展=============
名词解释
Clustered Index:聚集索引,又称聚簇索引。
Nonclustered indexes:非聚集索引,又称非聚簇索引。
Secondary Key:二级索引,因为聚集索引只能有一个,所有同一个表其他字段只能是二级索引也就是非聚集索引。
看看经典著作《高性能MySQL(第3版)》关于聚簇索引的说明:
再看看关于隐式创建聚簇索引的说明:
关于二级索引:
MyISAM的数据分布:
InnDB最关键的就是聚集索引叶子节点存所有的数据项,二级索引存的是主键值,而不是行指针,而MyISAM存的是行指针:
下面是 InnoDB和MyISAM的索引数据存储分布,如图所示MyISAM是索引叶子节点有指针指向,而 InnoDB则直接存数据没用指针:
下面这个帖子也是写的极好的 ,作者很会画图,整体还是没用超越《高性能MySQL(第3版)》,如果上面的还看不懂可以看看此贴--《MySQL索引背后的数据结构及算法原理》。
MyISAM索引实现
MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。下图是MyISAM索引的原理图:
InnoDB索引实现
虽然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。
第一个重大区别是InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。
第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址:
- 聚集索引、非聚集索引、聚集索引组织表、堆组织表、Mysql/PostgreSQL对比、联合主键/自增长、InnoDB/MyISAM(引擎方面另开一篇)
- MySQL中的Rows,Row_format以及MyISAM和InnoDB的一点区别
- MySQL中的Rows,Row_format以及MyISAM和InnoDB的一点区别
- Mysql中InnoDB与MyISAM索引的区别?
- MySQL中MyISAM和InnoDB对B-Tree索引不同的实现方式
- MySQL中myisam和innodb的主键索引有什么区别?
- MySQL中myisam和innodb的主键索引有什么区别?
- mysql 索引长度tips innodb和myisam引擎
- MYSQL的全表扫描,主键索引(聚集索引、第一索引),非主键索引(非聚集索引、第二索引),覆盖索引四种不同查询的分析...
- 【数据库SQL】——聚集索引和非聚集索引根本区别以及使用方式
- MySql中启用InnoDB数据引擎简介 以及 InnoDB与 MYISAM的区别和联系
- MySQL的MyISAM与InnoDB的索引方式
- MySQL原理研究:myisam和innodb索引实现的不同
- MySQL的MyISAM与InnoDB的索引方式
- MYisam和InnoDB区别以及MySQL引擎简介
- MySQL的MyISAM与InnoDB的索引方式
- MySQL在Innodb和MyISAM中的二级索引
- MySQL中的Rows,Row_format以及MyISAM和InnoDB的一点区别
- SQL Server的聚集索引和非聚集索引的的创建和区别以及相关问题
- Mysql innodb引擎和myisam引擎使用索引区别