聚簇索引和非聚簇索引

·807·2 分钟·
AI摘要: 本文介绍了聚簇索引和非聚簇索引在MySQL中的物理存储方式。聚簇索引将表的索引和数据存放在一起,而非聚簇索引则分开存放。文章进一步分析了这两种索引结构在查询和修改操作中的性能差异:聚簇索引在查询时速度更快,但修改时可能导致B+树分裂和合并,非聚簇索引则相对耗时较少。

聚簇索引/非聚簇索引并非是一种类似主键索引的逻辑上的索引结构,而是物理存储方式。以MySQL为例,Innodb引擎采用的就是聚簇索引,而myisam则是非聚簇索引。

我们从文件名来对比聚簇索引和非聚簇索引的物理结构:

  • Innodb的存储文件为:.frm.idb, 前者存储表的结构,后者存储表内部数据的索引和数据

  • MyISAM的存储文件为:.frm.mydmyyi, 分别存储表的结构、表的数据和表的索引

很明显可以看出来,所谓是否聚簇就是表的索引和数据是否存放在一起。

在更加深入idb的内部细节,如下图,叶子节点存储着数据和索引

image-20241111140654787

.myd.myYI的内部细节,如下图,叶子节点存储着索引和数据的地址,如果想要拿到真正的地址,是需要拿着地址到.myd文件中二次查找。

image-20241111140742853

我们继续从查询和修改两个角度分析两种物理存储的优缺点:

  • 查询:

    • 聚簇索引:只需要一次查找就能找到数据

    • 非聚簇索引:一次查找只能拿到数据的地址,需要再用地址进行二次查找,速度略慢

  • 修改:如果我们修改了索引的键,可能会导致导致B+树的分裂和合并

    • 聚簇索引:叶子节点的分裂和合并需要挪动数据本身和索引,比较耗时

    • 非聚簇索引:叶子节点的分裂和合并只需要挪动数据的地址和索引,比较快,修改代价小

Kaggle学习赛初探