MySQL高级第二篇:索引的分类及MyISAM与InnoDB中的索引对比

文章介绍了MySQL中索引的三种类型:聚簇索引、非聚簇索引(二级索引)和联合索引,重点讨论了InnoDB的B+树索引特性和MyISAM的区别。InnoDB的索引是聚簇的,数据与索引存储在一起,而MyISAM索引和数据分开,且非聚簇。文章强调了合理使用索引的重要性,因为过多的索引会影响性能。
摘要由CSDN通过智能技术生成

一、索引的分类

1. 聚簇索引

  • 针对主键构建的索引,聚簇即数据行和相邻的键值存储在一起。

  • 聚簇索引并不是一种单独的索引类型,而是一种数据存储方式,即所有的用户记录都存储在了叶子结点,索引即数据,数据即索引

  • 特点:

    • 叶子节点存储一条条完整记录,记录之间单向链表相连
    • 页内记录按主键大小顺序排序,页之间双向链表连接,页之间也升序排列
    • 这种索引无序我们手动创建,InnoDB会自动创建
  • 优点:

    • 数据访问更快,因为直接保存了完整记录,直接就查到了,无需回表操作
    • 对主键的 排序查找和范围查找更快
  • 缺点:

    • 插入速度严重依赖插入顺序
    • 更新主键代价比较高
    • 二级索引访问需要两次索引查找
  • 限制:

    • MySQL数据库只有InnoDB支持聚簇索引
    • 每个MySQL表只能有一个聚簇索引,一般就是主键
    • 如果没有定义主键,InnoDB会选择非空的唯一索引代替,如果页没有,就会隐式的定义一个主键作为聚簇索引

2. 非聚簇索引(二级索引,辅助索引)

  • 针对非主键构建的索引,可以有多个非聚簇索引
  • 非聚簇索引不保存完整记录,且按照索引列排序
  • 非聚簇索引只能确定主键,查找完整数据时,需要回表,再到聚簇索引中查找一遍

3. 联合索引(也属于非聚簇索引)

  • 同时为多个列建立索引,以多个列大小作为排序规则
  • 本质上也是一个二级索引

二、InnoDB的 B+ 树索引注意

1. 根页面位置始终不变

  • 每当为某个表创建索引时,最开始还没有数据的时候,就会为它创建一个根结点页面。
  • 然后慢慢往表中插入记录,这时先保存在这个根结点页中
  • 当根结点满了后,会将根节点所有记录复制一份,然后页分裂,移动数据等,这时根结点页便升级为目录页了
  • 整个过程最开始的根页面始终不会移动改变

2.内节点中目录项记录的唯一性

  • 对于二级索引来说,当为某列建立索引时,假如多条记录的这一列都是相同的,我们再来添加一条记录,和已有的那些记录也相同,这时,我们就找不到要插入到哪一页了。
  • 所以,我们要保证目录项记录的唯一性,如果这一列有重复,可以冗余保存上主键,这样就不会重复了

3. 一个页面最少存储两条记录

这个很简单,每个页只存储一条的话,完全没有什么效果,连树的结构都不能形成。

三、MyISAM与InnoDB中的索引对比

  • MyISAM索引文件和数据文件分离,索引仅保存数据地址
  • MyISAM的索引都是非聚簇的,每次都要进行一次回表
  • 它的回表是根据地址直接去拿,比较快速
  • InnoDB表必须有主键,MyISAM无所谓

四、思考?

  • 索引这么方便,我们是不是上来就要建索引呢?
  • 其实并不是,索引虽然好,但不合理的使用索引只有坏处没有好处
  • 一个表上的索引越多,占用的存储空间就会越大,在增删改记录的时候需要维护索引,性能就会变差
  • 所以,学习如何合理的使用索引就显得尤为重要
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Anton丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值