一、聚集索引与非聚集索引
聚集索引:
聚集索引就是索引和数据存储在一块的如InnoDB
聚集索引有时候也叫聚簇索引
非聚集索引:
非聚集索引就是索引和数据分开存储如MyISAM
二、MyISAM
采用MyISAM在磁盘中是怎样存储的呢?
MyISAM索引文件和数据文件是分开的(非聚集),存储引擎在磁盘中文件有三个,
一个是 .frm 文件(数据表定义),
一个是 .MYI(索引),
一个是 .MYD(实际数据,存储的是一整行的数据,包括索引值)。
MY文件是B+Tree为底层组织的文件。
比如查找 49,那么再 .MYI 中找到 49对应的磁盘指针 0x49,根据 0x49 去 .MYD找到实际的数据内容 data。
三、InnoDB
InnoDB存储引擎是聚集索引的。它的表数据文件本身就是按 B+Tree 组织的一个索引文件。
不同于MyISAM存储引擎是,数据不分离。
如下图,找到49的索引之后,数据就在该节点,不必像MyISAM存储引擎那样,需要根据磁盘指针到另一个文件中取数据。性能比MyISAM高。
InnoDB必须要有主键,并且推荐使用整型自增主键
要有主键:mysql底层就是用B+Tree维护的,而B+Tree的结构就决定了必须有主键才能构建B+Tree树这个结构。每个表在磁盘上,是单独的一个文件。索引和数据都在其中,文件是按照主键索引组织的一个B+TREE结构。假如没有定义主键,MySQL会在挑选能唯一标识的字段作为索引;假如找不到,会生成一个默认的隐藏列作为主键列。
整型主键:假如使用类似 UUID 的字符串作为主键,那么在查找时,需要比较两个主键是否相同,这是一个相比整型比较 非常耗时的过程。需要一个字符,一个字符的比较,自然比较慢。
自增主键:自增的好处体现在,
后面的主键索引总是大于前面的主键索引,在做范围查询时,非常方便找到需要的数据。
在添加的过程中,因为是自增的,每次添加都是在后面插入,树分裂的机会小;而UUID大小不确定,分裂机会大,性能损耗大。
7.2.3 为什么非主键索引结构叶子节点存储的是主键值?
非主键的 data存储的是 主键值的好处:
- 节省空间:指向主键的节点,不用再存储一份相同的数据;
- 数据一致性:如果修改索引15 的数据,那只要修改主键的 data,
- 而如果非主键的data也存一份的话,那得修改两份。
三、 联合索引
我们可以看到联合索引的key值可以为好几个那么他们是怎么实现递增的呢?
如何实现递增
例如key为(a,b,c)
先比较a大的在右边
如果a相同比较b
如果ab相同比较c