关于数据库索引的入门简述

news2024/9/20 14:31:19

一、简介

        数据库索引是现代数据库中高效数据检索的一个重要工具。它在优化查询性能和加快数据检索操作方面发挥着重要作用。这里我们深入了解下数据库索引其内部工作原理、优点和局限性。

二、数据库

1、SQL 数据库

        为了理解索引,先说一句数据库,数据库是可靠地插入、存储、更新、检索和删除数据的一种有组织的方式。它们的工作方式是将有关各种实体的信息存储在表中,每个表由行和列组成:

2、表结构和列

        在表中,数据被组织成行,每行代表一个记录或条目。另一方面,列定义这些记录的各种属性或属性。为了说明这一点,让我们看下面这个包含三列的简单表:ID、电子邮件名称

         从我们的需求考虑触发,列大概就需要以下3种类型之一:

  • 主键 – 每个表只有一个,它通过唯一值标识表的每个条目
  • 唯一列 – 每个表零、一个或多个,它定义了一个恰好对每一行唯一的属性
  • 非唯一列 – 每个表零、一个或多个,它定义了一个可以重复的属性

        因此,每个用户都由他的ID标识,具有唯一的电子邮件地址,并且还具有其他用户可能碰巧相同的名称。

三、索引

        让我们接着聊聊索引。当我们为列编制索引时,我们就可以更快地进行搜索,需要为此付出的代价是创建额外的数据结构。这使得对大量数据的所有搜索都明显加快。

1、搜索非唯一列

        假设我们要查找名为“Michael”的用户。由于多个用户可以具有此名称,因此我们需要遍历表中的所有行,以确保找到所有行。

        如果有n行,我们需要平均花费O(n)时间才能找到答案。

        下图显示了我们在标准列中找到项目的速度:

2、搜索唯一列

        假设我们要查找具有“michael.scott@gmail.com”电子邮件地址的用户。由于电子邮件应该是唯一的,因此我们可以在找到具有所需值的行后立即停止搜索。

        如果有n行,我们需要平均花费O(\frac{n+1}{2})时间,才能找到答案。

        下图显示了我们在唯一列中找到项目的速度:

3、 搜索主键

        假设我们要查找 ID 等于 4291 的用户。仅仅因为 ID 是主键,我们搜索步骤明显减少。事实上,如果有n行,我们需要花费O(log(n))平均时间以找到答案。最后,下图显示了使用主键列进行搜索的性能:

         对比以上这3种情况,我们可以看看下表:

         O(log(n))是其中最快的,而且对于大型数据库来说,它与其他2个版本之间的差异变得天文数字。 这可能是等待查询几秒钟而不是几个小时之间的区别。

4、搜索索引列

        索引的思想是使通过特定列的搜索与通过主键的搜索一样快。

        假设检查数据库中是否存在电子邮件地址是我们经常执行的操作,然后我们应该对其进行优化。我们不希望将主键 ID 替换为电子邮件列,因为我们希望允许用户更改其电子邮件地址而不会丢失其标识。

        在此情况下,解决方案就是在电子邮件列上创建数据库索引。

        下表显示了我们需要进行的平均检查次数与查询中使用的列类型之间的时间差异:

四、性能

        介绍在确定特定列是否需要索引时应考虑的几个性能注意事项。

        我们将从以下用户表开始,该表最初没有应用索引:

1、索引多列

        索引的主要目的是大大提高数据库检索的性能。但是,需要做出权衡。虽然每个涉及具有索引的列的查询都快得多,但每个数据库插入、更新或删除都会变慢。我们拥有的索引越多,修改条目所需的时间就越多,不仅如此,每个条目占用的空间要多得多。

         考虑到这一点,我们可以考虑索引“电话”和“电子邮件”列(下图中加粗显示),因为这些列在用户登录时非常有用:

         我们不应该做的是索引“名称”和“地址”列。这是典型的矫枉过正,因为使用他的地址或名字快速找到用户可能不是一个现实的应用程序需求。

2、索引低基数列

        在基数较低的列(意思是与记录总数相比,它们他们只具有少量非重复值,比如Male和Female)创建索引意义不大。在这种情况下,索引可能不会提供显著的性能改进,因为它无论如何都会导致扫描表的大部分。在决定是否创建索引之前,评估列的基数和唯一性非常重要。

        因此,在“性别”列上索引我们的表格将非常无效,因为它只有两个可能的值:Male和Female。

五、小结

        通过创建高效的数据结构并在搜索期间利用它们,索引可显著降低查询的时间复杂度。它允许快速访问特定记录,尤其是在涉及唯一或主键列的情况下。

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

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

相关文章

Jenkins小技巧汇总

设置变量 设置全局环境变量 全局变量除了系统内置的全局环境变量之外,用户也可以设置全局变量。设置路径:【Dashboard】–>【Manage Jenkins】–>【System Configuration 下的 System】–>【Global properties】从描述中我们可以看到&#xf…

Jetson nano 之 ROS入门 - - 深度学习环境配置

文章目录 前言一、Anaconda安装二、Pytorch 与 TensorFlow 环境配置三、TensorRT 推理引擎配置总结 前言 Jetson Nano是一款由NVIDIA推出的小型计算机,其性能优异、功耗低、体积小巧,非常适合用于嵌入式系统和边缘设备的深度学习应用。Jetson Nano搭载了…

【Git原理与使用】-- 基本操作

目录 添加文件 查看objects中的文件 小结 修改文件 版本回退 回退的回退 小结 撤销修改 情况一:对于工作区的代码,还没有 add 情况二:已经 add ,但没有 commit 情况三:已经 add ,并且也 commit …

Cordic IP核使用说明以及避坑记录

Cordic IP核使用说明以及避坑记录 参考文章:(140条消息) Vivado cordic IP核rotate和translate使用详解(附有代码)_cordic ip核 rotate_迎风打盹儿的博客-CSDN博客 (140条消息) VIVADO cordic IP核_卡布奇诺加勺糖的博客-CSDN博客 文章目录 Cordic IP核使用说明以及…

面试题:推排序是一种稳定排序吗?

面试题:推排序是一种稳定排序吗? 在回答该问题前,首先需要了解什么是稳定排序。 稳定性就是指对于两个关键字相等的记录,它们在序列中的相对位置,在排序之前和排序之后没有发生改变。通俗地讲就是有两个关键字相等的…

Node.js---菜鸟教程

文章目录 创建第一个应用创建 Node.js 应用 NPM 使用介绍使用 npm 命令安装模块本地安装使用 package.json模块的操作 回调函数阻塞代码实例非阻塞代码 事件循环事件驱动程序 EventEmitterEventEmitter 类方法实例error 事件继承 EventEmitter Buffer(缓冲区&#x…

Redis-缓存

新增或者更新数据时,创建以后顺便存到redis中去【维护缓存】 获取的时候先从redis缓存中拿数据 如果拿数据的时候为空,则到数据库中拿数据,后再存到redis缓存中去 大量的商品【包括冷门商品】都进行上面的缓存,那么就很耗内存 针对每个数据进行缓存的时候 维护一个过期时间…

MQTT(一)

MQTT(一) 1.背景 学习目标:经过了解,Netty占用服务器资源内存大、远距离传感器在极端条件下数据处理兼容较差(网络条件差,需要反复重连等)。从同行业了解到,现在主流工业传输使用M…

【博学谷学习记录】超强总结,用心分享 | 架构师 zabbix学习总结

文章目录 一、介绍zabbix zabbix专有词汇 二、zabbix zabbix实践修改zabbix zabbix语⾔服务器可视化指标解决zabbix zabbix乱码问题查看监控内容可视化监控agent agent的cpu cpu动态查看模板--监控项⾃定义监控项语法 一、介绍 Zabbix 是由 Alexei Vladishev 开发的⼀种⽹络监…

达梦数据库介绍

文章目录 前言一、达梦数据库的定位二、达梦有哪些工具1、达梦管理工具2、达梦数据迁移工具3、 达梦数据库配置助手4、其它工具 三、Linux下的工具1、数据库初始化工具2、数据库迁移工具3、其它工具 四、其它连接工具总结 前言 近几年由于各种原因,国内开启了一波国…

【Android】-- 如何对APP版本控制/更新?

目录 一、 前提准备 1、获取服务器 2、使用工具操作云服务器 二、Json格式网页 三、创建file_paths.xml及修改AndroidManifest.xml 四、在java代码加入更新检测代码 效果如图: 可以强制更新和非强制更新,和浏览器下载安装包。 一、 前提准备 1、获取…

0001-TIPS-2020-hxp-kernel-rop : ret2user

目的 理解系统调用的过程:从用户态进入内核态,再从内核态返回用户态。细节见文末的参考了解一般性提权方法commit_creds(prepare_kernel_cred (0)); 环境搭建 下载 pwn 2020-kernel-rop wget https://2020.ctf.link/assets/files/kernel-rop-bf9c106…

说精神力量的词,愿力很神奇

说精神力量的词,愿力最神奇! ​愿力,心力,精神,精 气 神,气 ,能量 【能量】是个外来词 趣讲大白话:200天了,布道的愿力推动我 【趣讲信息科技200期】 ******************…

【换根DP】生活在树上

换根DP板子题 D-生活在树上_牛客小白月赛46 (nowcoder.com) 题意: 思路: 看数据范围是1e6且是统计问题,求的是对于每一个点的统计问题,那就逃不出是换根DP了 首先dfs1一次把树形DP求出来,然后再考虑换根 设dp[u]…

Wireshark抓包分析(ARP TCP DNS HTTP)

目录 一、ARP 二、DNS 三、TCP TCP的总过程: ​TCP三次握手: TCP四次挥手: 四、HTTP 一、ARP 1.ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。 我们要抓ARP 同网段内…

(学习日记)2023.06.15

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

0003-TIPS-2020-hxp-kernel-rop : bypass-KPTI-with-trampoline

KPTI KPTI描述内容摘录自ctf wiki KPTI 机制最初的主要目的是为了缓解 KASLR 的绕过以及 CPU 侧信道攻击。 在 KPTI 机制中,内核态空间的内存和用户态空间的内存的隔离进一步得到了增强。 内核态中的页表包括用户空间内存的页表和内核空间内存的页表。 用户态的页…

minikube 试炼

点我进入 minikube 试炼 今天我们先来尝试使用一下 minikube ,可以进入到 https://kubernetes.io/zh/docs/tutorials/hello-minikube/ 页面上直接感受,或者通过如下指令,将 minikube 放入我们的服务器上面进行使用 简单安装 minikube Linu…

在Centos Stream 9上Docker的实操教程(六) - Docker Compose容器编排详解

在Centos Stream 9上Docker的实操教程 - Docker Compose容器编排详解 前言什么是Docker-Compose下载安装和卸载使用仓库安装手动安装卸载 docker compose常用命令项目实战构建SpringBoot项目编写Dockerfile文件编写Docker-Compose.yml文件 运行测试相关注意事项结语 前言 在了…

使用Pyinstall将PyQT5工程打包成.exe应用程序(包含图标一同打包)

1.首先安装pyinstaller。 pip install pyinstaller 2.PyQT5制作程序中使用到的ico等一系列图标文件&#xff0c;要先经过.qrc文件转成.py文件后&#xff0c;才可跟随打包文件一同打包。 首先创建一个.qrc文件&#xff0c;将图片文件全部写进去&#xff0c;例如: <RCC>&…