MySQL高级第二篇:索引的分类及MyISAM与InnoDB中的索引对比
- 一、索引的分类
- 1. 聚簇索引
- 2. 非聚簇索引(二级索引,辅助索引)
- 3. 联合索引(也属于非聚簇索引)
- 二、InnoDB的 B+ 树索引注意
- 1. 根页面位置始终不变
- 2.内节点中目录项记录的唯一性
- 3. 一个页面最少存储两条记录
- 三、MyISAM与InnoDB中的索引对比
- 四、思考?
一、索引的分类
1. 聚簇索引
2. 非聚簇索引(二级索引,辅助索引)
- 针对非主键构建的索引,
可以有多个非聚簇索引
- 非聚簇索引不保存完整记录,且按照索引列排序
非聚簇索引只能确定主键,查找完整数据时,需要回表,再到聚簇索引中查找一遍
3. 联合索引(也属于非聚簇索引)
同时为多个列建立索引
,以多个列大小作为排序规则- 本质上也是一个二级索引
二、InnoDB的 B+ 树索引注意
1. 根页面位置始终不变
- 每当为某个表创建索引时,最开始还没有数据的时候,就会为它创建一个根结点页面。
- 然后慢慢往表中插入记录,这时先保存在这个根结点页中
当根结点满了后,会将根节点所有记录复制一份,然后页分裂,移动数据等,这时根结点页便升级为目录页了
- 整个过程最开始的根页面始终不会移动改变
2.内节点中目录项记录的唯一性
- 对于二级索引来说,当为某列建立索引时,假如多条记录的这一列都是相同的,我们再来添加一条记录,和已有的那些记录也相同,这时,我们就找不到要插入到哪一页了。
- 所以,我们要保证目录项记录的唯一性,如果这一列有重复,
可以冗余保存上主键,这样就不会重复了
3. 一个页面最少存储两条记录
这个很简单,每个页只存储一条的话,完全没有什么效果,连树的结构都不能形成。
三、MyISAM与InnoDB中的索引对比
MyISAM索引文件和数据文件分离,索引仅保存数据地址
- MyISAM的索引都是非聚簇的,每次都要进行一次回表
它的回表是根据地址直接去拿,比较快速
- InnoDB表必须有主键,MyISAM无所谓
四、思考?
- 索引这么方便,我们是不是上来就要建索引呢?
- 其实并不是,索引虽然好,但不合理的使用索引只有坏处没有好处
一个表上的索引越多,占用的存储空间就会越大,在增删改记录的时候需要维护索引,性能就会变差
- 所以,学习如何合理的使用索引就显得尤为重要