Mysql的聚簇索引(聚集索引)和非聚簇索引的区别

2023-12-17 06:28

本文主要是介绍Mysql的聚簇索引(聚集索引)和非聚簇索引的区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

MySQL中的索引分为两种主要类型:聚簇索引(Clustered Index)和非聚簇索引(Non-clustered Index)。这两种索引的主要区别在于它们如何组织数据和索引的方式。

聚簇索引(Clustered Index)

聚簇索引决定了数据行的物理存储顺序。也就是说,表中的数据行实际上按照聚簇索引的键值顺序存储在磁盘上。在InnoDB存储引擎中,每个表只能有一个聚簇索引,通常默认情况下,它由主键组成。如果没有显式定义主键,则会选择唯一的非空索引来作为聚簇索引。如果不存在这样的列,则InnoDB会自动创建一个隐藏的row-id作为聚簇索引。

聚簇索引的优点:
  • 数据访问更快,因为索引和数据保存在一起。
  • 对于全表扫描或范围查询效率较高,因为数据已经按照索引顺序存储。
聚簇索引的缺点:
  • 更新主键代价高,因为会导致物理存储重新排列。
  • 插入新行可能需要大量移动现有行,特别是对于连续递增的键值。
  • 删除记录可能导致数据页留有空洞,需要维护碎片。

非聚簇索引(Non-clustered Index)

非聚簇索引并不影响数据行的物理存储顺序。每个非聚簇索引都有独立的数据结构,通常采用B-tree数据结构,存储索引键值以及指向对应数据行的指针。这意味着非聚簇索引本身不包含数据行的实际值,只是提供了找到数据行的方法。

非聚簇索引的优点:
  • 多个非聚簇索引可以存在于同一表中。
  • 更新非聚簇索引通常比更新聚簇索引代价低。
  • 非聚簇索引可以包含更多的列,而不必受限于聚簇索引的要求。
非聚簇索引的缺点:
  • 访问数据时需要两次查找:先找到索引条目,然后通过指针定位数据行(被称为“回表”查询)。
  • 较大的索引可能需要额外的磁盘空间。

总结

聚簇索引和非聚簇索引各有优劣,选择合适的索引策略取决于具体的查询需求和数据模型。通常来说,频繁用于查询条件、排序或分组的列适合创建索引,尤其是那些返回结果集较小的选择性高的列。同时,也要考虑到索引维护的成本,特别是在高并发写入的情况下。

这篇关于Mysql的聚簇索引(聚集索引)和非聚簇索引的区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

在Dockerfile中copy和add的区别及说明

《在Dockerfile中copy和add的区别及说明》COPY和ADD都是Dockerfile中用于文件复制的命令,但COPY仅用于本地文件或目录的复制,不支持自动解压缩;而ADD除了复制本地文件或... 目录在dockerfile中,copy 和 add有什么区别?COPY 命令ADD 命令总结在Doc

MySQL 日期时间格式化函数 DATE_FORMAT() 的使用示例详解

《MySQL日期时间格式化函数DATE_FORMAT()的使用示例详解》`DATE_FORMAT()`是MySQL中用于格式化日期时间的函数,本文详细介绍了其语法、格式化字符串的含义以及常见日期... 目录一、DATE_FORMAT()语法二、格式化字符串详解三、常见日期时间格式组合四、业务场景五、总结一、

mysql线上查询之前要性能调优的技巧及示例

《mysql线上查询之前要性能调优的技巧及示例》文章介绍了查询优化的几种方法,包括使用索引、避免不必要的列和行、有效的JOIN策略、子查询和派生表的优化、查询提示和优化器提示等,这些方法可以帮助提高数... 目录避免不必要的列和行使用有效的JOIN策略使用子查询和派生表时要小心使用查询提示和优化器提示其他常

grom设置全局日志实现执行并打印sql语句

《grom设置全局日志实现执行并打印sql语句》本文主要介绍了grom设置全局日志实现执行并打印sql语句,包括设置日志级别、实现自定义Logger接口以及如何使用GORM的默认logger,通过这些... 目录gorm中的自定义日志gorm中日志的其他操作日志级别Debug自定义 Loggergorm中的

MySQL InnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据

《MySQLInnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据》mysql的ibdata文件被误删、被恶意修改,没有从库和备份数据的情况下的数据恢复,不能保证数据库所有表数据... 参考:mysql Innodb表空间卸载、迁移、装载的使用方法注意!此方法只适用于innodb_fi

mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据

《mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据》文章主要介绍了如何从.frm和.ibd文件恢复MySQLInnoDB表结构和数据,需要的朋友可以参... 目录一、恢复表结构二、恢复表数据补充方法一、恢复表结构(从 .frm 文件)方法 1:使用 mysq

mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespace id不一致处理

《mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespaceid不一致处理》文章描述了公司服务器断电后数据库故障的过程,作者通过查看错误日志、重新初始化数据目录、恢复备... 周末突然接到一位一年多没联系的妹妹打来电话,“刘哥,快来救救我”,我脑海瞬间冒出妙瓦底,电信火苲马扁.

MySQL进阶之路索引失效的11种情况详析

《MySQL进阶之路索引失效的11种情况详析》:本文主要介绍MySQL查询优化中的11种常见情况,包括索引的使用和优化策略,通过这些策略,开发者可以显著提升查询性能,需要的朋友可以参考下... 目录前言图示1. 使用不等式操作符(!=, <, >)2. 使用 OR 连接多个条件3. 对索引字段进行计算操作4

MySQL表锁、页面锁和行锁的作用及其优缺点对比分析

《MySQL表锁、页面锁和行锁的作用及其优缺点对比分析》MySQL中的表锁、页面锁和行锁各有特点,适用于不同的场景,表锁锁定整个表,适用于批量操作和MyISAM存储引擎,页面锁锁定数据页,适用于旧版本... 目录1. 表锁(Table Lock)2. 页面锁(Page Lock)3. 行锁(Row Lock

MySQL zip安装包配置教程

《MySQLzip安装包配置教程》这篇文章详细介绍了如何使用zip安装包在Windows11上安装MySQL8.0,包括下载、解压、配置环境变量、初始化数据库、安装服务以及更改密码等步骤,感兴趣的朋... 目录mysql zip安装包配置教程1、下载zip安装包:2、安装2.1 解压zip包到安装目录2.2