数据库索引种类

news2024/11/18 22:25:43

文章目录

  • 索引的优缺点
    • 优点
    • 缺点
  • 聚簇索引
    • 特点
    • 优点
    • 缺点
  • 非聚簇索引
    • 特点
    • 优点
    • 缺点
    • 使用场景:
  • 在MyISAM与InnoDB中的使用

索引的优缺点

索引概述
MySQL官方将索引定义为帮助MySQL高效获取数据的数据结构。索引的本质是一种排好序的快速查找数据结构,用于满足特定查找算法。这些数据结构指向数据,允许实现高级查找算法。

优点

索引带来多个优点:

  1. 提高数据检索效率,降低数据库的IO成本,类似于大学图书馆的书目索引,是主要创建索引的原因。
  2. 创建唯一索引可以确保数据库表中每一行数据的唯一性
  3. 有助于实现数据参考完整性,可以加速表和表之间的连接,尤其在有依赖关系的子表和父表联合查询时,可以提高查询速度。
  4. 在使用分组和排序子句进行数据查询时,可以显著减少查询中分组和排序的时间,降低CPU的消耗。

缺点

增加索引也伴随着一些不利的方面:

  1. 创建和维护索引需要耗费时间,随着数据量的增加,所需时间也会增加。
  2. 索引需要占用磁盘空间,除了数据表占用的数据空间之外,每个索引还需要一定的物理空间,存储在磁盘上。如果有大量的索引,索引文件可能会比数据文件更快达到最大文件尺寸。
  3. 尽管索引大大提高了查询速度,却会降低更新表的速度。当对表中的数据进行增加、删除和修改时,索引也需要动态地维护,从而降低了数据的维护速度。

因此,在选择是否使用索引时,需要综合考虑索引的优点和缺点。’

聚簇索引

特点

聚簇索引(Clustered Index)具有以下特点:

  1. 物理存储顺序: 聚簇索引决定了数据行在表中的物理存储顺序。数据行按照聚簇索引的键值顺序在磁盘上连续存储,这有助于减少磁盘I/O操作,提高查询性能。

  2. 唯一性要求: 聚簇索引要求键值是唯一的,因为它确定了数据行的物理存储顺序。通常,表的主键列用于创建聚簇索引,以确保数据行的唯一性。

  3. 主键索引: 聚簇索引通常与表的主键相关联。主键是表的唯一标识符,使用聚簇索引对主键列进行快速查找非常有效。

  4. 只有一个聚簇索引: 通常情况下,每张表只能有一个聚簇索引,因为数据行的物理存储顺序只能有一个。这与非聚簇索引不同,一张表可以有多个非聚簇索引。

  5. 使用记录主键值的大小进行记录和页的排序,这包括三个方面的含义:

    • 页内 的记录是按照主键的大小顺序排成一个 单向链表
    • 各个存放 用户记录的页 也是根据页中用户记录的主键大小顺序排成一个 双向链表
    • 存放 目录项记录的页 分为不同的层次,在同一层次中的页也是根据页中目录项记录的主键
      大小顺序排成一个 双向链表 。
  6. B+树的叶子节点存储的是完整的用户记录

    • 所谓完整的用户记录,就是指这个记录中存储了所有列的值(包括隐藏列)。

优点

  • 数据访问更快 ,因为聚簇索引将索引和数据保存在同一个B+树中,因此从聚簇索引中获取数据比非聚簇索引更快
  • 聚簇索引对于主键的 排序查找范围查找 速度非常快
  • 按照聚簇索引排列顺序,查询显示一定范围数据的时候,由于数据都是紧密相连,数据库不用从多个数据块中提取数据,所以 节省了大量的io操作 。

缺点

  • 插入速度严重依赖于插入顺序 ,按照主键的顺序插入是最快的方式,否则将会出现页分裂,严重影响性能。因此,对于InnoDB表,我们一般都会定义一个自增的ID列为主键
  • 更新主键的代价很高 ,因为将会导致被更新的行移动。因此,对于InnoDB表,我们一般定义主键为不可更新
  • 二级索引访问需要两次索引查找 ,第一次找到主键值,第二次根据主键值找到行数据。

非聚簇索引

特点

  • 非聚簇索引不改变数据表的物理顺序,而是在索引中维护了数据行的引用。
  • 每张表可以有多个非聚簇索引,每个非聚簇索引都有自己的独立存储结构。
  • 非聚簇索引通常包括索引键和指向数据行的指针或物理地址。(Best important)
  • 非聚簇索引的构建和维护会增加存储空间和维护成本,但提供了更快的读取性能。

优点

  • 提高检索性能:非聚簇索引允许快速查找和过滤数据,因为它们提供了索引键的有序列表,减少了需要扫描整个表的需求。
  • 支持覆盖索引:非聚簇索引可以覆盖查询的所有列,从而避免了对实际数据行的访问,进一步提高查询性能。
  • 支持多个索引:可以在同一表上创建多个非聚簇索引,以满足不同查询的需求。

缺点

  • 额外存储开销:每个非聚簇索引都需要额外的存储空间来存储索引键和指向数据行的指针。
  • 更新性能下降:插入、更新和删除操作需要维护非聚簇索引,这可能导致性能下降,尤其是在频繁的大批量数据更改情况下。
  • 索引选择的复杂性:在设计数据库时,需要仔细选择哪些列应该创建非聚簇索引,以避免不必要的索引浪费存储空间。

使用场景:

  • 支持频繁的查询操作:非聚簇索引适用于需要快速检索数据的查询操作,特别是针对某些列的查找、过滤和排序操作。
  • 覆盖查询需求:当查询需要覆盖索引中的所有列,非聚簇索引是一个不错的选择,因为它可以减少对数据行的访问次数。
  • 辅助索引:非聚簇索引通常用于支持数据表的主要聚簇索引以外的其他查询需求,例如范围查询、联接操作等。

在MyISAM与InnoDB中的使用

MyISAM 与 InnoDB 是两种不同的存储引擎,它们在索引和数据存储方面有很多区别。以下是它们之间的主要比较:

  1. 索引类型

    • MyISAM 使用非聚簇索引,所有索引都是二级索引,不包含实际数据记录。
    • InnoDB 包含一个聚簇索引,可以根据主键值一次查找实际数据记录。
  2. 数据文件和索引文件

    • InnoDB 的数据文件本身就是索引文件,包含实际数据记录。
    • MyISAM 的索引文件和数据文件是分离的,索引文件只保存数据记录的地址。
  3. 非聚簇索引中的数据存储

    • InnoDB 的非聚簇索引中的data域存储相应记录的主键值。
    • MyISAM 的索引记录存储的是数据记录的地址。
  4. 回表操作

    • MyISAM 的回表操作是快速的,因为它直接使用地址偏移量来获取数据记录。
      • “回表”:在数据库查询中,当使用非聚簇索引(或次要索引)来查找数据时,需要额外的步骤来获取完整的数据行。
    • InnoDB 通过获取主键之后再去聚簇索引中找记录,虽然也较快,但不如直接使用地址来访问。
  5. 主键要求

    • InnoDB 要求表必须有主键,如果没有显式指定,MySQL会自动选择一个非空且唯一标识数据记录的列作为主键。
    • MyISAM 可以没有显式主键。

总之,InnoDB 的设计更加适用于需要事务支持和高并发读写的应用,而MyISAM 更适合于只有读操作的应用,或者不需要事务支持的情况。选择哪种引擎应该根据具体的应用需求来决定。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1112733.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLOv5/v7/v8改进实验(五)之使用timm更换YOLOv5模型主干网络Backbone篇

🚀🚀 前言 🚀🚀 timm 库实现了最新的几乎所有的具有影响力的视觉模型,它不仅提供了模型的权重,还提供了一个很棒的分布式训练和评估的代码框架,方便后人开发。更难能可贵的是它还在不断地更新迭…

(H5轮播)vue一个轮播里显示多个内容/一屏展示两个半内容

效果图 : html: <div class"content"><van-swipeclass"my-swipe com-long-swipe-indicator":autoplay"2500"indicator-color"#00C4FF"><van-swipe-itemclass"flex-row-wrap"v-for"(items, index) in M…

Kubernetes 进阶

Kubernetes 进阶  Service 控制器  Ingress 对象(对外暴露应用)  管理应用程序配置  K8s 数据卷与持久数据卷  再谈有状态应用部署:StatefulSet控制器  K8s 安全访问控制  K8s 部署利器Helm初探 Service 控制器 • Service存在的意义 • Pod与…

更改Kali Linux系统语言以及安装zenmap

目录 更改Kali Linux系统语言 安装 Zenmap 更改Kali Linux系统语言以及安装zenmap 在使用kali的过程中&#xff0c;会遇到许多问题&#xff0c;其中一个就是看不懂英语&#xff0c;下面是如何更换语言的步骤。 更改Kali Linux系统语言 首先&#xff0c;打开kali&#xff0…

学信息系统项目管理师第4版系列32_信息技术发展

1. 大型信息系统 1.1. 大型信息系统是指以信息技术和通信技术为支撑&#xff0c;规模庞大&#xff0c;分布广阔&#xff0c;采用多级 网络结构&#xff0c;跨越多个安全域&#xff1b;处理海量的&#xff0c;复杂且形式多样的数据&#xff0c;提供多种类型应用 的大系统 1.1.…

python安装、输入输出、注释、中文编码、编码规范等基础语法

一、概述 1、简介 Python的创始人为吉多范罗苏姆&#xff08;Guido van Rossum&#xff09;。1989年的圣诞节期间&#xff0c;Guido开始写Python语言的编译器。Python这个名字&#xff0c;来自Guido所挚爱的电视剧Monty Python’s Flying Circus。他希望这个新的叫做Python的…

30 Python的matplotlib模块

概述 在上一节&#xff0c;我们介绍了Python的pandas模块&#xff0c;包括&#xff1a;Series、DataFrame、数据读取和写入等内容。在这一节&#xff0c;我们将介绍Python的matplotlib模块。matplotlib模块是一个Python的2D绘图库&#xff0c;可以实现各种类型的图形绘制&#…

【试题021】C语言算术运算符例题

1.题目&#xff1a;表达式4.8-1/25%3的值是 &#xff1f; 2.代码解析&#xff1a; //表达式4.8-1/25%3的值是?printf("%d\n", (4 - 1 / 2 5 % 3));//分析&#xff1a;多个运算符看优先级高低次序//根据口诀可知&#xff1a; /和%都排第三&#xff0c;和-排第四//所…

AutoSAR入门:应用背景及简介

1、应用背景 在我们现在的汽车行业里面&#xff0c;汽车电子的发展过程中&#xff0c;我们发现有一些新的趋势汽车电子系统的复杂性不断增长。 我们现在可以看到车辆有越来越多的功能&#xff0c;那么这些功能呢&#xff0c;也在往这个控制器上进行集中&#xff0c;比如说我们现…

修炼k8s+flink+hdfs+dlink(六:学习k8s)

一&#xff1a;增&#xff08;创建&#xff09;。 直接进行创建。 kubectl run nginx --imagenginx使用yaml清单方式进行创建。 二&#xff1a;删除。 kubectl delete pods/nginx 三&#xff1a;修改。 kubectl exec -it my-nginx – /bin/bash 四&#xff1a;查看。 …

【Leetcode每日一题 1726】「组合|哈希表」同积元组

2023.10.19 本题重点&#xff1a; 1.题目的理解&#xff0c;如何转化成一种组合问题 2.哈希表的使用 题目介绍&#xff1a; 给你一个由 不同 正整数组成的数组 nums &#xff0c;请你返回满足 a * b c * d 的元组 (a, b, c, d) 的数量。其中 a、b、c 和 d 都是 nums 中的元…

11. 机器学习 - 评价指标2

文章目录 混淆矩阵F-scoreAUC-ROC 更多内容&#xff1a; 茶桁的AI秘籍 Hi, 你好。我是茶桁。 上一节课&#xff0c;咱们讲到了评测指标&#xff0c;并且在文章的最后提到了一个矩阵&#xff0c;我们就从这里开始。 混淆矩阵 在我们实际的工作中&#xff0c;会有一个矩阵&am…

【计算机网络笔记】OSI参考模型基本概念

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

分布式存储 vs. 全闪集中式存储:金融数据仓库场景下的性能对比

作者&#xff1a;深耕行业的 SmartX 金融团队 张德敏 近年来随着金融行业的高速发展&#xff0c;经营决策者及监管机构对信息时效性的要求越来越高&#xff0c;科技部门面临诸多挑战。例如&#xff0c;不少金融机构使用数仓业务系统&#xff0c;为公司高层提供日常经营报表&am…

阿里云服务器x86计算架构ECS规格大全

阿里云企业级服务器基于X86架构的实例规格&#xff0c;每一个vCPU都对应一个处理器核心的超线程&#xff0c;基于ARM架构的实例规格&#xff0c;每一个vCPU都对应一个处理器的物理核心&#xff0c;具有性能稳定且资源独享的特点。阿里云服务器网aliyunfuwuqi.com分享阿里云企业…

InitializeComponent报错(提示不存在)

我是c#新手。为了解决这个问题&#xff0c;需要按照以下步骤进行。、 WPF应用(.NET Framework) 解决问题 首先&#xff0c;确保项目的类型为WPF应用(.NET Framework)&#xff1b; 然后&#xff0c;代码的位置应正确处于项目的MainWindow.xaml.cs&#xff1b; 最后&#xff0c…

Deno 快速入门

目录 1、简介 2、安装Deno MacOS下安装 Windows下安装 Linux 下安装 3、创建并运行TypeScript程序 4、内置Web API和Deno命名空间 5、运行时安全 6、导入JavaScript模块 7、远程模块和Deno标准库 8、使用deno.json配置您的项目 9、Node.js API和npm包 10、配置IDE…

宏(预编译)详解

目录 一、程序的编译环境 二、运行环境 三、预编译详解 3.1预定义符号 3.2.1 #define 定义标识符 3.2.2 #define 定义宏 3.2.3#define替换规则 3.2.4 #和## 2)##的作用&#xff1a; 3.2.5宏和函数的对比 3.2.6宏的命名约定和#undef指令 一、命名约定&#xff1a; …

CCC数字钥匙设计【NFC】--通过NFC进行车主配对Phase3

1、车主配对流程介绍 车主配对可以通过车内NFC进行&#xff0c;若支持UWB测距&#xff0c;也可以通过蓝牙/UWB进行。通过NFC进行车主配对总共有5个Phase。本文档主要对Phase3进行介绍。 1) Phase0&#xff1a;准备阶段&#xff1b; 2) Phase1&#xff1a;启动流程&#xff1…

C语言中的3种注释方法

C语言中的3种注释方法 2021年8月28日星期六席锦 在用C语言编程时&#xff0c;常用的注释方式有如下几种&#xff1a; (1)单行注释 // … (2)多行注释 /* … */ (3)条件编译注释 #if 0…#endif (1)(2)在入门教程中比较常见。 对于(1) 【单行注释 // …】&#xff0c;注释只能显示…