Mysql中的聚簇索引cluster index解析

 更新时间:2023年10月13日 08:46:14   作者:青岛老甜沫  
这篇文章主要介绍了Mysql中的聚簇索引cluster index解析,聚簇索引是一种数据库索引的类型,它将数据行物理上存储在磁盘上按照索引的顺序进行排序,聚簇索引可以提高查询性能,因为它可以减少磁盘I/O操作,需要的朋友可以参考下

聚簇索引(cluster index)

一个表只能有一个聚簇索引。

目前,只有solidDB和InnoDB支持聚簇索引,MyISAM不支持聚簇索引。一些DBMS允许用户指定聚簇索引,但是MySQL的存储引擎到目前为止都不支持。

InnoDB的聚簇索引:

  • InnoDB对主键建立聚簇索引。
  • 如果你不指定主键,InnoDB会用一个具有唯一且非空值的索引来代替。
  • 如果不存在这样的索引,InnoDB会定义一个隐藏的主键,然后对其建立聚簇索引

InnoDB默认使用聚簇索引来组织数据,如果你用InnoDB,而且不需要特殊的聚簇索引,一个好的做法就是使用代理主键(surrogate key)—独立于你的应用中的数据。最简单的做法就是使用一个AUTO_INCREMENT的列,这会保证记录按照顺序插入,而且能提高使用primary_key进行连接的查询的性能。应该尽量避免随机的聚簇主键,例如字符串主键就是一个不好的选择,它使得插入操作变得随机

变得随机的不好的地方

聚簇索引保证关键字的值相近的元祖存储的物理位置也相近(所以字符串类型不宜简历聚簇索引,特别是随机字符串,会使系统进行大量的移动操作)

一般来说,DBMS都会以聚簇索引的形式来存储实际的数据,它是其他二级索引的基本:

  • 聚簇索引(primary索引):主键索引
  • 非聚簇索引(second索引):二级索引 聚簇索引的结构:

聚簇索引的结构:

节点页只包含了索引列,叶子页包含了行的全部数据。聚簇索引“就是表”,因此可以不需要独立的行存储

二级索引:叶子节点保存的不是指行的物理位置的指针,而是行的主键值 。

这意味着通过二级索引查找行,存储引擎需要:

  1. 找到二级索引的叶子节点获得对应的主键值
  2. 根据这个主键值去聚簇索引中查找对应的行。这里需要两次B-Tree查找而不是一次。

覆盖索引对于InnoDB表尤其有用,因为InnoDB使用聚簇索引组着数据,如果二级索引中包含查询所需的数据,就不再需要在聚集索引中查找了。

聚簇索引(InnoDB)和二级索引(MyISAM)

数据布局比较:

CREATE TABLE layout_test (
  col1 int NOT NULL,
  col2 int NOT NULL,
  PRIMARY KEY(col1),
  KEY(col2)
);

MyISAM

MyISAM按照插入的顺序在磁盘上存储数据:

左边为行号(row number),从0开始。因为元组的大小固定,所以MyISAM可以很容易的从表的开始位置找到某一字节的位置。

MyISAM建立的索引结构大致如下:

cod1主键索引:

MyISAM不支持聚簇索引,索引中每一个叶子节点仅仅包含行号(row number),且叶子节点按照col1的顺序存储。

col2非主键索引:

在MyISAM中,primary key和其他索引没有什么区别。Primary key仅仅只是一个叫做PRIMARY的唯一,非空的索引而已,叶子节点按照col2的顺序存储。

InnoDB:

col1主键索引,即聚簇索引:

聚簇索引中的每个叶子节点包含主键的值,事务ID,用于事务和MVVC的回滚指针、余下的列

col2非主键索引,及二级索引

InnoDB的二级索引的叶子包含主键的值,而不是行指针(row pointers),这样的策略减小了移动数据或者数据页面分裂时维护二级索引的开销,因为InnoDB不需要更新索引的行指针。

到此这篇关于Mysql中的聚簇索引cluster index解析的文章就介绍到这了,更多相关Mysql聚簇索引内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现邮件发送QQ邮箱带附件

    Java实现邮件发送QQ邮箱带附件

    这篇文章主要为大家详细介绍了Java实现邮件发送QQ邮箱带附件功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • SpringBoot如何使用ApplicationContext获取bean对象

    SpringBoot如何使用ApplicationContext获取bean对象

    这篇文章主要介绍了SpringBoot 如何使用ApplicationContext获取bean对象,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java读取一行空格隔开的数字字符串并求出这些数字的和方法

    Java读取一行空格隔开的数字字符串并求出这些数字的和方法

    今天小编就为大家分享一篇Java读取一行空格隔开的数字字符串并求出这些数字的和方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Java本地缓存的实现代码

    Java本地缓存的实现代码

    本篇文章主要介绍了Java本地缓存的实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Java Spring 循环依赖解析

    Java Spring 循环依赖解析

    这篇文章主要介绍了Java Spring 循环依赖解析,Spring 现在其实是我们 Java 程序开发离不开的基础框架,个人觉得除了 JDK 我们用得最多的 Java 中间件就是 Spring ,今天我们一起来学习一下 Spring 的循环依赖。下面详细内容需要的小伙伴可以参考一下
    2022-02-02
  • JavaFX程序初次运行创建数据库并执行建表SQL详解

    JavaFX程序初次运行创建数据库并执行建表SQL详解

    这篇文章主要介绍了JavaFX程序初次运行创建数据库并执行建表SQL详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • SpringSecurity实现权限认证与授权的使用示例

    SpringSecurity实现权限认证与授权的使用示例

    本文主要介绍了SpringSecurity实现权限认证与授权的使用示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-11-11
  • java中多线程的超详细介绍

    java中多线程的超详细介绍

    这篇文章主要给大家介绍了关于java中多线程的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • Java中的clone方法详解_动力节点Java学院整理

    Java中的clone方法详解_动力节点Java学院整理

    clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。下面通过本文给大家介绍java中的clone方法,感兴趣的朋友一起看看吧
    2017-06-06
  • 多模块项目引入SpringSecurity后一直报404的解决方案

    多模块项目引入SpringSecurity后一直报404的解决方案

    这篇文章主要介绍了多模块项目引入SpringSecurity后一直报404的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06

最新评论