【数据库】基于索引的扫描算法,不同类型索引下的选择与连接操作,不同的代价及优化

news2025/1/1 10:46:47

基于索引的算法

专栏内容

  • 手写数据库toadb
    本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。
    本专栏会定期更新,对应的代码也会定期更新,每个阶段的代码会打上tag,方便阶段学习。

开源贡献

  • toadb开源库

个人主页:我的主页
管理社区:开源数据库
座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.

文章目录

  • 基于索引的算法
  • 前言
  • 概述
  • 索引类型
  • 使用索引的选择
    • 索引选择代价
    • 索引扫描对几种常见选择操作的优化
  • 使用索引的连接
  • 有序索引的连接
  • 总结
  • 结尾

在这里插入图片描述

前言

随着信息技术的飞速发展,数据已经渗透到各个领域,成为现代社会最重要的资产之一。在这个大数据时代,数据库理论在数据管理、存储和处理中发挥着至关重要的作用。然而,很多读者可能对数据库理论感到困惑,不知道如何选择合适的数据库,如何设计有效的数据库结构,以及如何处理和管理大量的数据。因此,本专栏旨在为读者提供一套全面、深入的数据库理论指南,帮助他们更好地理解和应用数据库技术。

数据库理论是研究如何有效地管理、存储和检索数据的学科。在现代信息化社会中,数据量呈指数级增长,如何高效地处理和管理这些数据成为一个重要的问题。同时,随着云计算、物联网、大数据等新兴技术的不断发展,数据库理论的重要性日益凸显。

概述

在一张表的一个或多个列属性上带有索引,使得一些没有索引时,不可行的算法,在使用索引后就可行了。

对基于索引的选择操作,尤其有作用,连接和其它二元操作也使用索引可以获得较好的效率。

本文将分享带有索引的表中进行索引扫描操作时的流程,代价的分析。

索引类型

我们先来看一下聚簇索引和非聚簇索引,因为它们两者在索引扫描下的代价差异是非常大的。

如果一个表的元组紧缩到能存储它们的尽可能少的数据块中,那么这个表是“聚簇”的,之前分享的几种算法的代价估计,都是基于这种假设的。
一个或多个属性上的聚簇索引,具有索引查询关键的所有元组都出现在能容纳它们的尽可能少的数据块中;

而一个非聚簇关系,是不能够有一个聚簇索引的,相反是可以的。

使用索引的选择

对于表扫描的最基本操作就是选择,我们通过读取表的所有元组,来执行一个选择,看那个元组能满足某一条件,并且返回结果元组。

如果表R上没有索引,那么我们只能遍历表的所有数据块,扫描每个数据块上的所有元组,代价就是数据块数据的IO次数,最差情况是数据块的数量同元组数量相等。

而当表上选择对应的列上建有索引时,我们可能通过索引找到元组所在的数据块,如果表对应的元组分类的数量为V,表的数据块总数为B,那么对应的磁盘IO计算方法为 B/V;

索引选择代价

假如每个查询关键字都是不一样的,那么V的数量可以认为是表的元组数量,它比表的数据块数量大的多,此时的代价磁盘IO数量近似为1,当然还会有一些额外的磁盘IO发生,原因如下:

  • 索引一般也要从磁盘上来读取,它也需要一些磁盘IO;
  • 当对应元组的块加载到内存中,符合条件的其它元组不在同一个块中,所以还会再额外读取块;
  • 尽管是聚簇的,但也不可能完全填满数据块,因为数据库在运行过程中要留有一定空间方便以后插入元组;所以数据块的数量比完全填满 要大一些;

索引扫描对几种常见选择操作的优化

  • 对于范围的选择,可以通过索引找到范围内的所有元组,一次取回所有元组,达到顺序读取的效果。

  • 对于多条件复杂选择,可以将多个逻辑查询是做串联,第一个通过索引查询,第二个在此基础上再选择,当然还有其它查询优化方法,将在后续文章中介绍。

使用索引的连接

当两个表R(X,Y)与表S(Y,Z)进行自然连接时,同时连接属性列上都建有索引。索引对于连接操作的变动如下:

  1. 读取表R对应的Y的索引块,并依次获取索引项RY;
  2. 从头开始读取表S对应的Y的索引块,查找RY是否存在;
  3. 如果不存在,继续重复步骤1;
  4. 如果存在,执行表R和表S对应元组的连接;
  5. 直到表S的索引块结束,继续重复步骤1;

最后表R的索引块处理完毕;整个过程类似与之前的介绍的连接步骤,区别是这里不再读取表的数据块,而索引往往相对数据来说,非常小。

假设表S中Y属性列的值分类数量为V(S),S表的元组数量为T(S),那么对于S表的IO次数为T(S)/V(S);而表R的元组数量为T®,那么对应的索引连接操作的代价为 T®T(S)/V(S),这时S表的代价占比较大。

如果外层R表较小时,整体代价下降较大。

有序索引的连接

对于连接属性上含有索引,而且它是一个有序的索引,如BTree索引,类似之前分享的基于排序的连接,而且使用一趟算法即可完成。

对于R上的索引,在S的索引中查找,如果不存在,此时不需要访问各自的表数据块;对于找到的索引项,取R的元组与S的相同元组进行连接;因为索引是有序的,按照S的索引顺次往下遍历,也可以一次性拿出S符合的索引项,再依次找到对应数据元组。

总结

当表上有索引时,可以利用索引减少加载大量表数据块的磁盘IO成本,但是当数据表比较小时,优化效果不明显,当数据表非常大时,索引的使用对于磁盘IO减少是非常大的。

解释器模式是一种行为型设计模式,用于构建解释器系统,如编译器或解释器等。在这种模式中,我们定义了一个抽象语法树(AST),并使用解释器来遍历AST并解释执行。

下面是一个简单的解释器模式实现,使用C语言编写,可以解释并输出"Hello World":

#include <stdio.h>
#include <stdlib.h>

// 抽象语法树节点结构体定义
typedef struct Node {
    char *name; // 节点名称
    struct Node *children[10]; // 子节点数组
    int num_children; // 子节点数量
} Node;

// 创建节点函数
Node *create_node(char *name) {
    Node *node = (Node *)malloc(sizeof(Node));
    node->name = name;
    node->num_children = 0;
    return node;
}

// 添加子节点函数
void add_child(Node *parent, Node *child) {
    parent->num_children++;
    parent->children[parent->num_children - 1] = child;
}

// 解释器函数,遍历AST并输出"Hello World"
void interpreter(Node *root) {
    if (root == NULL) {
        return;
    }
    if (strcmp(root->name, "print") == 0) {
        printf("Hello World\n");
        return;
    }
    for (int i = 0; i < root->num_children; i++) {
        interpreter(root->children[i]);
    }
}

int main() {
    // 构建AST,根节点为"print",子节点为空
    Node *root = create_node("print");
    interpreter(root); // 遍历AST并输出"Hello World"
    return 0;
}

在上述代码中,我们定义了一个抽象语法树节点结构体Node,包含节点名称、子节点数组和子节点数量。然后,我们创建了create_nodeadd_child函数,用于构建AST。在interpreter函数中,我们遍历AST并判断根节点的名称是否为"print",如果是,则输出"Hello World"。如果是其他节点,则递归遍历其子节点。最后,在main函数中,我们构建了一个AST,根节点为"print",子节点为空,并调用interpreter函数来遍历AST并输出"Hello World"。

结尾

非常感谢大家的支持,在浏览的同时别忘了留下您宝贵的评论,如果觉得值得鼓励,请点赞,收藏,我会更加努力!

作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。

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

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

相关文章

WordPress更改文章分类插件

当WP网站内容比较多的时候&#xff0c;有时候如果涉及到批量修改文章分类&#xff0c;如果一个个的去操作的话就太费事了&#xff0c;如果使用后台批量修改分类的话是增加旧分类不会取消选择&#xff0c;就就导致我们适得其反还需要一个一个的去编辑取消&#xff0c;实在繁琐了…

机器人与3D视觉 Robotics Toolbox Python 一 安装 Robotics Toolbox Python

一 安装python 库 前置条件需要 Python > 3.6&#xff0c;使用pip 安装 pip install roboticstoolbox-python测试安装是否成功 import roboticstoolbox as rtb print(rtb.__version__)输出结果 二 Robotics Toolbox Python样例程序 加载机器人模型 加载由URDF文件定义…

Pinia仓库统一管理

pinia独立维护 在src/stores文件夹下创建index.js文件&#xff0c;将main.js中关于pinia的语句放到index.js中 index.js文件内容&#xff1a; import { createPinia } from pinia import piniaPluginPersistedstate from pinia-plugin-persistedstate const pinia createPi…

电商API接口的接入|京东商品API接口接入说明

京东联盟商品接口API申请&#xff1a; 一、京东联盟 - 注册/登录 1、网址&#xff1a;https://union.jd.com 2、首次登录请先注册&#xff0c;注册成功后即可登录&#xff0c;需要完善个人信息&#xff0c;用于佣金结算。如果有京东商城的账号&#xff0c;也可以直接登录。 …

【存储】blotdb的原理及实现(2)

【存储】etcd的存储是如何实现的(3)-blotdb 在etcd系列中&#xff0c;我们对作为etcd底层kv存储的boltdb进行了比较全面的介绍。但是还有两个点没有涉及。 第一点是boltdb如何和磁盘文件交互。 持久化存储和我们一般业务应用程序的最大区别就是其强依赖磁盘文件。一方面文件数…

想要更快的文件传输?看看这些aspera的替代方案吧

随着数据量的增大&#xff0c;文件传输已经成为许多公司和组织日常工作中必不可少的环节之一。而对于大容量、海量数据的传输&#xff0c;普通的传输方式可能甚至无法胜任。Aspera作为一种高效的文件传输协议应运而生&#xff0c;其能够在处理大容量、高速传输方面表现出色。然…

Excel导出操作

<div class"right"> <el-button size"mini" click"exportEmployee">excel导出</el-button></div>安装file-saver $ npm i file-saver $ yarn add file-saver //下包后引入 import FileSaver from "file-sav…

开放式耳机怎么选?自费千元测评,百元、千元价位选哪个

开放式耳机以其不入耳式设计&#xff0c;更容易带给用户舒适的佩戴体验&#xff0c;也不影响使用中聆听周围声响&#xff0c;还可以保证长时间的舒适佩戴&#xff0c;适配漫长的通勤、游玩旅程。当然&#xff0c;开放式耳机种类也有许多&#xff0c;究竟哪一款更适合大家呢&…

离散系统的频域分析(数字信号处理实验2-1)

创建具有15 Hz和40 Hz分量频率的信号&#xff0c;叠加两个信号形成混合信号x&#xff0c;使用fft命令绘制x的频域图&#xff0c;标注频率为横坐标&#xff0c;平均能量为纵坐标。 文章目录 一.题目二.实验目的三.实验仪器四.实验原理1.MATLAB使用函数2.离散傅里叶变换(DFT)实验…

人工智能(pytorch)搭建模型21-基于pytorch搭建卷积神经网络VoVNetV2模型,并利用简单数据进行快速训练

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能(pytorch)搭建模型21-基于pytorch搭建卷积神经网络VoVNetV2模型&#xff0c;并利用简单数据进行快速训练。VoVNetV2模型是计算机视觉领域的一个重要研究成果&#xff0c;它采用了Voice of Visual Residual&…

“2024上海智博会、2024北京智博会”双展联动,3月上海,6月北京

“2024上海智博会、2024北京智博会”双展联动&#xff0c;将分别于3月和6月在上海和北京举办。这两个展会旨在充分展示智慧城市、人工智能、物联网、大数据、软件等新兴行业的最新产品和技术。 作为中国最具影响力和创新力的智能科技展会&#xff0c;上海智博会和北京智博会吸引…

C#——Delegate(委托)与Event(事件)

C#——Delegate&#xff08;委托&#xff09;与Event&#xff08;事件&#xff09; 前言一、Delegate&#xff08;委托&#xff09;1.是什么&#xff1f;2.怎么用&#xff1f;Example 1&#xff1a;无输入无返回值Example 2&#xff1a;有输入Example 3&#xff1a;有返回值Exa…

实现数据一体化的有效措施

数据一体化的趋势 数据一体化是指将企业内部和外部的各种数据资源整合、统一管理和共享利用的过程&#xff0c;是当前信息化发展的重要趋势。 统一数据平台&#xff1a;企业越来越意识到数据是重要资产&#xff0c;需要建立统一的数据平台&#xff0c;集中管理和利用各类数据资…

直击广州车展 | 远航汽车“卷”出新高度

第23届广州车展作为2023年汽车行业的年度收官之作&#xff0c;成为各大汽车厂商“秀肌肉”的绝佳舞台&#xff0c;22万平方米的开放展区内容纳了1132辆展车&#xff0c;包括全球首发车59辆、概念车20辆、新能源车469辆。 新能源汽车产业发展迅猛&#xff0c;得益于新能源车型在…

开源vs闭源,大模型的未来在哪一边?

开源和闭源&#xff0c;两种截然不同的开发模式&#xff0c;对于大模型的发展有着重要影响。开源让技术共享&#xff0c;吸引了众多人才加入&#xff0c;推动了大模的创新。而闭源则保护了商业利益和技术优势&#xff0c;为大模型的商业应用提供了更好的保障。 那么&#xff0c…

Android-P CameraSerivce

0 前言 本文重点分析Android-P的CameraService实现。 验证:Goldfish模拟器 1 定义 图1.1 CameraService ICameraServiceframeworks/av/camera/aidl/android/hardware/ICameraService.aidlBnCameraServiceout/soong/.intermediates/frameworks/av/camera/libcamera_client/an…

如何远程开关机电脑丨远程开关机电脑的小技巧

在日常生活和工作中&#xff0c;我们可能需要远程控制电脑的开关机。下面就介绍几种常用的远程开关机方法。 方法一&#xff1a; 一、自行下载域之盾软件 https://www.yuzhidun.cn/https://www.yuzhidun.cn/ 二、在一台老板电脑上部署管理端&#xff0c;在想要远程开关机的电…

03、K-means聚类实现步骤与基于K-means聚类的图像压缩(2)

03、K-means聚类实现步骤与基于K-means聚类的图像压缩&#xff08;2&#xff09; 工程下载&#xff1a;K-means聚类实现步骤与基于K-means聚类的图像压缩 其他&#xff1a; 03、K-means聚类实现步骤与基于K-means聚类的图像压缩&#xff08;1&#xff09; 03、K-means聚类实现…

day66

今日回顾内容 web框架 django 路由控制 视图层 web框架 一、什么是web框架 Web框架&#xff08;Web framework&#xff09;是一种开发框架&#xff0c;用来支持动态网站、网络应用和网络服务的开发。这大多数的web框架提供了一套开发和部署网站的方式&#xff0c;也为web行…

从0开始学习JavaScript--JavaScript中的解构赋值及使用场景

在现代JavaScript中&#xff0c;解构赋值是一种强大而灵活的语法特性&#xff0c;它允许从数组或对象中提取值并赋给变量。这种语法不仅使代码更简洁&#xff0c;而且提高了可读性。在本篇文章中&#xff0c;将深入探讨JavaScript中解构赋值的基本概念、语法规则以及丰富的使用…