当前位置: 首页 > news >正文

主键索引和普通索引的区别

问题

主键索引和普通索引的区别

我的回答

存储结构和数据访问方式

主键索引(聚簇索引)的数据存储方式是,索引和数据行是存储在一起的。具体来说,在InnoDB中,主键索引的B+树叶子节点存储的是整行数据。当你根据主键查询时,直接就能从索引树上获取到完整的数据行,一步到位。

而普通索引(二级索引/非聚簇索引)的B+树叶子节点存储的是索引列的值和对应的主键值,不包含其他列的数据。所以当你使用普通索引查询时,通常需要两步:先通过普通索引找到主键值,然后再通过主键值去主键索引中查找完整的数据行。这个过程叫做"回表"。

举个例子,假设有一个用户表,主键是id,还有name字段建了普通索引:

  • 如果执行SELECT * FROM users WHERE id = 1,数据库直接从主键索引获取完整行数据。
  • 如果执行SELECT * FROM users WHERE name = 'Tom',数据库先从name索引找到id值,再根据id去主键索引查找完整数据。

唯一性和约束

主键索引强制要求索引列的值是唯一的且不能为NULL。一个表只能有一个主键,因此也只能有一个主键索引。主键通常用来唯一标识一行数据。

普通索引没有唯一性的要求,可以有重复值,也可以包含NULL值(除非你专门创建了唯一索引或NOT NULL约束)。一个表可以有多个普通索引,用于加速不同条件的查询。

性能影响

查询性能:主键索引查询通常比普通索引快,因为不需要回表操作。特别是在大表上,回表可能带来显著的性能开销。

更新性能:主键值的更新成本较高,因为可能需要移动数据行(特别是当表按主键顺序物理存储时)。而普通索引的更新相对轻量,只需要更新索引结构。

插入性能:如果使用自增主键,插入性能会很好,因为新行总是添加到末尾。但如果使用随机值作为主键(如UUID),可能导致页分裂,影响性能。

对于范围查询和排序查询,聚簇索引通常更有效率,因为它避免了额外的寻址开销。非聚簇索引在使用覆盖索引进行查询时效率更高,因为它不需要读取完整的数据行。但是需要进行回表的操作,使用非聚簇索引效率比较低,因为需要进行额外的回表操作。

http://www.dtcms.com/a/353767.html

相关文章:

  • 移动端(微信等)使用 vConsole调试console
  • 吱吱企业通讯软件打破跨部门沟通壁垒,为企业搭建安全的通讯环境
  • 论文Review 3DGS PGSR | TVCG2024 ZJU-3DV | 几何约束的3DGS表面重建
  • 京东大模型安全实践:从全链路防护到合规备案的完整技术方案
  • Apache Flink错误处理实战手册:2年生产环境调试经验总结
  • 私域电商新范式:开源AI智能名片链动2+1模式S2B2C商城小程序赋能传统行业流量转化
  • 从感知机到大模型:神经网络的全景解析与实践指南
  • MQTT broker 安装与基础配置实战指南(二)
  • STM32——中断
  • PLC_博图系列☞基本指令”PT:加载持续时间“
  • 基于Kafka的延迟队列
  • 身份证号校验码算法
  • C++中类继承的意义
  • PMP项目管理知识点-⑮预测型项目概念辨析
  • 【Kafka】项目整合使用案例
  • 瑞芯微开发工具Linux Linux_Upgrade_Tool使用方法(镜像烧录)
  • Python 比较huggingface_hub库的hf_hub_download函数和snapshot_download函数
  • 在 .NET 8.0 中实现 JWT 刷新令牌
  • 密钥管理服务KMS介绍
  • 遗传算法:模拟自然选择的优化智慧
  • 可编辑69页PPT | 某手机品牌主数据治理项目案例
  • 神经网络学习笔记12——高效卷积神经网络架构MobileNet
  • Origin 2024 安装包下载与安装教程
  • 【算法速成课1 | 题解】洛谷P3366 【模板】最小生成树 MST(Prim Kruskal)
  • 深度学习入门:神经网络基础知识
  • YOLO11实战 第006期-基于yolo11-seg的香蕉种植园语义分割实战文档(yolo格式数据免费获取)
  • MDK-5.4.2 集成 Compiler 5 编译器
  • 基于SpringBoot的协同过滤余弦函数的美食推荐系统(爬虫Python)的设计与实现
  • 数据结构:堆(Heap)
  • 生成式AI的引擎室:深入剖析LLM内存管理与调度