【面试题】MySQL的聚簇索引与非聚簇索引与主键索引:深入理解与应用

本文主要是介绍【面试题】MySQL的聚簇索引与非聚簇索引与主键索引:深入理解与应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

        • 引言
        • 基础知识
        • 核心概念
        • 引擎上的区别
          • InnoDB
          • MyISAM
        • 示例演示
        • 实际应用
        • 深入与最佳实践
        • 常见问题解答
        • 结语
        • 学习资源
        • 互动环节

引言

聚簇索引、非聚簇索引和主键索引的有什么区别你知道吗

在数据库设计中,索引是提高查询性能的关键。MySQL中的聚簇索引和非聚簇索引是两种不同的索引类型,它们在数据存储和检索方面有着显著的差异。理解这些差异对于优化数据库性能至关重要。

基础知识
  • 聚簇索引(Clustered Index):数据行的物理顺序与索引顺序相同的索引。
  • 非聚簇索引(Non-Clustered Index):数据行的物理顺序与索引顺序不同的索引。
核心概念
  • 数据存储:聚簇索引将数据存储与索引结构结合在一起,非聚簇索引则将数据存储与索引分开。
  • 查询性能:聚簇索引通常在查询时提供更快的访问速度,非聚簇索引可能需要额外的查找步骤。

聚簇索引、非聚簇索引和主键索引的主要区别
在于它们的存储方式、数据组织结构以及查询效率。‌

  • ‌聚簇索引‌(Clustered Index):
  • 聚簇索引实际上并不是一种单独的索引类型,而是一种数据存储方式。在InnoDB存储引擎中,聚簇索引的叶子节点包含了完整的记录行,这意味着表的数据行都存放在索引树的叶子页中。
  • 由于聚簇索引决定了表中数据的物理存储顺序,因此一张表只能有一个聚簇索引。InnoDB的聚簇索引实际上是将索引和数据保存在同一个B-Tree中,如果没有定义主键,InnoDB会选择一个合适的列作为聚簇索引,如果找不到合适的列,会使用一列隐藏的列DB_ROW_ID作为聚簇索引‌.
  • 非聚簇索引‌( n-clustered Index):
  • 非聚簇索引,也称为二级索引或辅助索引,其叶子节点仅包含主键值,而不包含完整的记录信息。通过非聚簇索引查找记录时,需要先通过非聚簇索引找到主键值,然后再通过主键值到聚簇索引中找到对应的记录行,这个过程称为回表查询。由于非聚簇索引的逻辑顺序与磁盘上行的物理存储顺序不同,因此一个表中可以拥有多个非聚簇索引。非聚簇索引的叶子节点中保存的不是指向行的物理指针,而是行的主键值,这有助于减少移动数据或分裂时维护非聚簇索引的开销‌
  • 主键索引‌:

主键索引是一种特殊的聚簇索引,它确保了数据的唯一性。在关系数据库中,主键是唯一标识表中每一行的列。当为表设置主键时,MySQL会自动为该主键创建一个聚簇索引。因此,主键索引既是聚簇索引的一种,也是数据库表中数据组织的核心‌

面试常问:聚簇索引不一定是主键索引,而主键索引一定是聚簇索引。

可以理解成在聚簇索引上建立的索引,都是非聚簇索引(也称为二级索引或辅助索引)。因为一个表中只能有一个聚簇索引,其他都是非聚簇索引。

引擎上的区别
InnoDB

使用的是聚簇索引,比如若使用“where id=5“的条件查找主键,则按照B+树的检索算法,即可查找到对应的叶子节点,之后获得行数据。

若对employee_name 列进行条件搜索,则需要两个步骤:
1.在辅助索引B+树中检索非主键列(eg:employee_name ),到达其叶子节点获取对应的主键。
2.用主键在主索引B+树种再执行一次B+树检索操作,最终到达叶子节点获取整行数据。(重点在于通过其他键需要建立辅助索引)

聚簇索引默认是主键,若表中无定义主键,InnoDB会选择一唯一且非空的索引代替。若无这样的索引,InnoDB会隐式定义一个主键(类似 oracle中的Rowld,使用一列隐藏的列DB_ROW_ID作为聚簇索引‌)作为聚簇索引。

若已设了主键为聚簇索引又希望再单独设置聚簇索引,必须先删除原主键,然后添加,最后恢复设置主键即可。

MyISAM

便用的是非聚簇索引,只是存储的内容不同,主键索引B+树的节点存储了主键, 辅助键索引IB+树存储了辅助键。

表数据存储在独立的地方(MYN文件),这两颗B+树的叶子节点都使用一个地址指向真正的表数据,对于表数据来说,这两个键没有任何差别。
由于索引树是独立的,通过辅助键检索无需访问主键的索引树。

示例演示
  1. 聚簇索引的使用

    CREATE TABLE employees (employee_id INT PRIMARY KEY,employee_name VARCHAR(100),department_name VARCHAR(100)
    );
    

    在这个例子中,employee_id是聚簇索引,因为它直接存储了数据行。

  2. 非聚簇索引的使用

    CREATE INDEX idx_department ON employees (department_name);
    

    idx_department是非聚簇索引,因为它指向数据行的位置。

实际应用
  • 查询优化:使用聚簇索引可以减少查询时的数据访问次数。
  • 数据插入:聚簇索引可以减少数据插入时的页分裂。
深入与最佳实践
  • 选择合适的索引类型:根据查询模式和数据访问模式选择合适的索引类型。
  • 避免过度索引:过多的索引会降低数据修改的性能。
常见问题解答
  • Q: 为什么聚簇索引通常比非聚簇索引更快?
    A: 聚簇索引的数据存储与索引结构结合在一起,减少了额外的数据查找步骤。

  • Q: 我应该在什么情况下使用非聚簇索引?
    A: 当你需要基于非主键列进行频繁查询时,非聚簇索引是一个好的选择。

结语

聚簇索引和非聚簇索引在MySQL中有着不同的应用场景和性能特点。了解它们的差异和最佳实践,可以帮助你更好地设计数据库索引,提高查询性能。

学习资源
  • MySQL官方文档:Indexes
互动环节
  • 分享你在数据库索引设计和优化方面的经验。

这篇关于【面试题】MySQL的聚簇索引与非聚簇索引与主键索引:深入理解与应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1139617

相关文章

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

mysql8.0.43使用InnoDB Cluster配置主从复制

《mysql8.0.43使用InnoDBCluster配置主从复制》本文主要介绍了mysql8.0.43使用InnoDBCluster配置主从复制,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录1、配置Hosts解析(所有服务器都要执行)2、安装mysql shell(所有服务器都要执行)3、

k8s中实现mysql主备过程详解

《k8s中实现mysql主备过程详解》文章讲解了在K8s中使用StatefulSet部署MySQL主备架构,包含NFS安装、storageClass配置、MySQL部署及同步检查步骤,确保主备数据一致... 目录一、k8s中实现mysql主备1.1 环境信息1.2 部署nfs-provisioner1.2.

MySQL中VARCHAR和TEXT的区别小结

《MySQL中VARCHAR和TEXT的区别小结》MySQL中VARCHAR和TEXT用于存储字符串,VARCHAR可变长度存储在行内,适合短文本;TEXT存储在溢出页,适合大文本,下面就来具体的了解... 目录一、VARCHAR 和 TEXT 基本介绍1. VARCHAR2. TEXT二、VARCHAR

MySQL中C接口的实现

《MySQL中C接口的实现》本节内容介绍使用C/C++访问数据库,包括对数据库的增删查改操作,主要是学习一些接口的调用,具有一定的参考价值,感兴趣的可以了解一下... 目录准备mysql库使用mysql库编译文件官方API文档对象的创建和关闭链接数据库下达sql指令select语句前言:本节内容介绍使用C/

mybatis直接执行完整sql及踩坑解决

《mybatis直接执行完整sql及踩坑解决》MyBatis可通过select标签执行动态SQL,DQL用ListLinkedHashMap接收结果,DML用int处理,注意防御SQL注入,优先使用#... 目录myBATiFBNZQs直接执行完整sql及踩坑select语句采用count、insert、u

MySQL之搜索引擎使用解读

《MySQL之搜索引擎使用解读》MySQL存储引擎是数据存储和管理的核心组件,不同引擎(如InnoDB、MyISAM)采用不同机制,InnoDB支持事务与行锁,适合高并发场景;MyISAM不支持事务,... 目录mysql的存储引擎是什么MySQL存储引擎的功能MySQL的存储引擎的分类查看存储引擎1.命令

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe