【数据库】数据库为什么比电子表格快

ops/2024/9/20 9:20:16/ 标签: 数据库

为了更深入地了解SQL数据库用于加速查询的特定算法和机制,让我们关注索引和查询优化。与在CSV等平面文件中进行线性搜索相比,这些基本方面使数据库中的查询速度更快。

1。索引

数据库中的索引有点类似于书籍中的索引,它允许你快速定位特定的信息,而无需阅读整本书。下面是它在数据库中的工作方式:

索引类型

  • B-tree(平衡树):SQL数据库中用于通用查询的最常见索引类型。它对于范围查询(相等查询和范围查询)特别有效。
  • 哈希索引:最适合比较相等。它使用散列表直接将键(您正在查询的值)映射到它们在数据库中的位置。
  • 位图索引:适用于列数据基数较低的场景(即,只有少量不同的值,例如布尔字段中的TRUE/FALSE)。
b树索引的工作原理
  • 结构:b树索引创建一个树结构,其中每个节点包含按特定顺序排序的键。节点中的每个键都指向一条数据库记录或B-tree中的一个较低级别的节点。
  • 查询:当你执行查询时,数据库引擎从b树的根节点开始,并在树的每个节点上根据键值进行决策,直到它到达叶子节点,叶子节点包含指向磁盘中实际数据记录的指针。
  • 效率:这种结构允许数据库显著减少磁盘访问次数。例如,与读取CSV文件中的每个条目相比,在有100万个条目的数据库中查找一条记录可能只需要三到四个步骤。

2。查询优化

SQL数据库使用高级查询优化算法来确定执行查询的最有效方法。下面是所发生事情的简化视图:

####查询优化器

  • 生成计划:优化器分析SQL查询并生成多种可能执行查询的策略。这些策略被表示为不同的“查询计划”。
  • 成本估算:每个计划都是根据其资源(如CPU、内存、I/O)方面的“成本”来评估的。成本模型估计执行计划需要多长时间。
  • 计划选择:优化器选择具有最低估计成本的查询计划。

执行

  • 执行引擎:一旦选择了最佳计划,数据库执行引擎将执行该计划。在执行过程中,引擎可能会使用索引、连接多个表、排序数据或应用聚合——所有这些都是基于底层数据和数据库结构进行优化的。

实际例子

假设你有一张数据库users,其中包含idnameemail列,并且你经常通过email进行查询。你可以在email列上创建一个b树索引。当你查询`SELECT * FROM users WHERE email = ‘user@example.com’; ',数据库:

  1. 使用B-tree索引快速定位email匹配user@example.com的记录。
  2. 只访问存储这些记录的相关磁盘页,跳过所有其他页。
  3. 返回结果比扫描每一行快得多。

通过使用这些复杂的机制,SQL数据库提供了健壮、高效和快速的数据检索功能,使其成为处理复杂查询和大型数据集的理想选择,与CSV文件所需的线性扫描形成鲜明对比。


http://www.ppmy.cn/ops/6896.html

相关文章

spdlog C++日志管理 安装和下载

下载地址 https://github.com/gabime/spdlog?tabreadme-ov-file 使用git拉取代码 按照操作进行编译 点击spdlog.sln,用vs2019打开,进行编译debug x64 每项都编译一下,会生成安装包 安装包下载路径 https://download.csdn.net/download…

❤ vue3 使用报错

❤ vue3 项目使用报错 vue3语法变动 TypeError: Assignment to constant variable (常量变量) 背景: Vue3 项目使用 TypeError: Assignment to constant variable. 原因: 因为我对const定义的常量重新赋值了 解决方法&#…

Linux——日志的编写与线程池

目录 前言 一、日志的编写 二、线程池 1.线程池基本原理 2.线程池作用 3.线程池的实现 前言 学了很多线程相关的知识点,线程控制、线程互斥、线程同步,今天我们将他们做一个总结,运用所学知识写一个较为完整的线程池,同时…

Arrays

Arrays:用来操作数组的一个工具类 Arrays类提供的常见方法: 方法名说明public static String toString(类型[ ] arr)返回数组的内容public static int[] copyOfRange(类型[ ] arr,起始索引,结束索引)拷贝数组&…

高版本Android studio 使用Markdown无法预览(已解决)

目录 概述 解决方法 概述 本人升级Android studio 当前版本为Android Studio Jellyfish | 2023.3.1 RC 2导致Markdown无法预览。 我尝试了很多网上的方法都无法Markdown解决预览问题,包括升级插件、安装各种和Markdown相关的插件及使用“Choose Boot Java Runtim…

物联网网关

物联网网关类似我们常见的路由器,具有网络接入能力,但是功能比较简单,通讯速率要求不高,看重移动网络接入能力一般只是做数据透传使用,将物联网的数据转发到服务器上,做进一步分析和处理网关是物联网非常重…

asp.net core mvc 路由

在ASP.NET Core MVC中,路由是一项核心功能,它负责将进来的HTTP请求映射到相应的控制器和动作方法上。ASP.NET Core支持两种路由方式:传统的基于模板的路由(约定路由)和属性路由。 1. 基于约定的路由 在Startup.Confi…

【第十二届“泰迪杯”数据挖掘挑战赛】【2024泰迪杯】B题基于多模态特征融合的图像文本检索—更新(正式比赛)

【第十二届“泰迪杯”数据挖掘挑战赛】【2024泰迪杯】B题基于多模态特征融合的图像文本检索—更新(正式比赛) 往期链接: 【第十二届“泰迪杯”数据挖掘挑战赛】【2024泰迪杯】B题基于多模态特征融合的图像文本检索—解题全流程(…

MongoDB多个collection更新的Transaction 实现

在MongoDB中,多个集合的事务管理主要适用于MongoDB的4.0版本及以上,因为MongoDB从4.0开始支持多文档事务。在Node.js环境下,如果你使用mongoose作为ORM库,可以利用其内置的事务支持来进行跨多个集合的操作。 下面是一个使用mongo…

【C++】每日一题 106 从中序与后续遍历序列构造二叉树

给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 #include <vector> #include <unordered_map>using namespace std;// Definition fo…

分享一个纯HTML的后台数据统计管理UI框架模板源码

纯HTML的后台数据统计管理UI框架模板源码 有很多好看的样式 以及各种图表 表格 大量的图标 源码 <!DOCTYPE html> <html lang"en"><head><!-- Required meta tags --><meta charset"utf-8"><meta name"viewport&qu…

如何在没有备份的情况下恢复iPhone数据

想要找到没有备份的最佳iPhone数据恢复软件吗&#xff1f;本文介绍了一款专业的iPhone数据恢复软件&#xff0c;无需备份即可恢复iPhone数据。 许多iPhone用户可能对上述情况并不陌生。丢失重要的iPhone数据确实是一件令人沮丧的事情。通常&#xff0c;检索iPhone数据的最佳方…

安防视频监控/视频集中存储EasyCVR平台级联时,下级平台未发流是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

exceljs库实现excel表样式定制化

概览 xlsx 是前端最热门的 Excel 导出方案&#xff0c;又叫做 SheetJs&#xff0c;默认不支持修改 Excel 的样式。而exceljs库就可以做到自定义excel表样式&#xff0c;下面来介绍一下其使用方法 一. 完整示例 代码示例 const exportTemplate2 () > { // 创建工作簿 …

我回顾做副业的两年

chat 1 - 之前的我在做什么 其实近一年多以来&#xff0c;生活发生了很多变化&#xff0c;其中有一个变化就是&#xff0c;我在不断的尝试寻找副业。可能有些朋友通过我之前的一些博文可以看到&#xff0c;我尝试卖过课&#xff08;代理&#xff09;、打过一些广告、也去自己做…

说说Java 8 引入的Stream API

介绍背景 Stream API&#xff0c;这是一种高效、易于使用的数据处理方式&#xff0c;它可以极大提高程序员对集合数据操作的效率和便利性。 1. Stream的基本概念 Java Stream是一种数据流&#xff0c;它可以用于对集合、数组或者其他支持的数据源进行批量操作。它不是数据结…

C语言基础---数组基本语法和案例

数组基本语法与使用方法 什么是数组 ● 数组是 C 语言中的一种数据结构&#xff0c;用于存储一组具有相同数据类型的数据。 ● 数组中的每个元素可以通过一个索引&#xff08;下标&#xff09;来访问&#xff0c;索引从 0 开始&#xff0c;最大值为数组长度减 1。 数组 数组…

【Linux开发 第七篇】权限

权限 Linux组权限修改权限 Linux组 在linux中的每个用户必须属于一个组&#xff0c;不能独立于组外 文件/目录 所有者 一般为文件的创建者&#xff0c;谁创建了该文件&#xff0c;就自然的成为了该文件的所有者 这一列即为文件的所有者 修改文件的所有者&#xff1a; chown…

上位机图像处理和嵌入式模块部署(树莓派4b和pcl点云库)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 图像处理&#xff0c;大家都知道它有显著的优点和缺点。优点就是分辨率高&#xff0c;信息丰富。缺点就是&#xff0c;整个图像本身没有深度信息。…

如何把npm切换成yarn管理项目

1.删掉项目中package-lock.json和依赖包 这一步手动删掉就好 2.全局安装yarn npm install -g yarn 3.可以开始执行yarn install安装依赖 1&#xff09;执行yarn init 这一步是修改npm生成的package.json文件&#xff0c;可能会遇到这个问题&#xff1a; 这个查了一下是有…