MySQL索引优化策略(四):聚集索引和非聚集索引数据结构及优劣对比

聚集索引并不是一个单独的索引类型,实际上是一种数据存储的方式。聚集索引的实现细节各有不同,在InnoDB引擎中,聚集索引实际上是将索引和数据行使用同样的结构存储在一个二叉树中。

如果数据表中有聚集索引,则数据行实际上是存在所以的叶子节点。“聚集”的形式实际是指相邻键值的数据行是邻近存储的。因为一行数据不能存储在两个叶子节点上,因此在数据表中只能有一个聚集索引。由于是存储引擎负责索引的实现,因此并不是全部的存储引擎都支持聚集索引。在这里我们只讨论InnoDB,但支持聚集索引的存储引擎实现聚集索引的原理都大同小异。

下图展示了数据记录在聚集索引的存储布局。注意,叶子节点包含了完整的数据行,而其他节点仅仅只有索引。在这个图中,索引列使用的是整数。
聚集索引数据存储
有些数据库服务器允许我们选择对哪个索引进行聚集,但MySQL的任意内置的存储引擎都不支持这么做。InnoDB使用主键对数据进行聚集,这意味着上图的索引列实际上是主键列。

如果数据表没有定义主键,InnoDB会选择使用唯一的非空列(Not Null)索引替代。如果没有这样的索引,InnoDB会定义一个隐藏的主键去完成数据聚集(因此,数据表最好自己定义主键)。InnoDB的只能在一个数据页中进行数据聚集,因此即便是临近的索引值的数据存储页也可能间隔很远。

一个聚集主键能够提高性能,但同样也可能导致严重的性能问题。因此,你应当谨慎考虑聚集的使用,尤其是当你将一个数据表的存储引擎从InnoDB改为其他引擎时。

聚集索引具有如下的优势:

    评论 1
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    打赏作者

    岛上码农

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

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

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

    打赏作者

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

    抵扣说明:

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

    余额充值