数据库核心技术:存储与索引概览

news2024/11/27 2:26:46

文章目录

    • 存储与索引技术概览
      • 存储结构
      • 索引技术
    • MySQL
      • 存储结构
      • 索引技术
      • 事务与锁
      • 优势
    • PostgreSQL
      • 存储结构
      • 索引技术
      • 事务与锁
      • 优势
    • Oracle
      • 存储结构
      • 索引技术
      • 事务与锁
      • 优势
    • SQL Server
      • 存储结构
      • 索引技术
      • 事务与锁
      • 优势
    • 选型考量
      • 存储结构
      • 索引技术
      • 事务与锁的支持
      • 综合因素
      • 未来趋势
    • 结语

数据库(这里仅探讨 关系数据库)底层技术涉及到很多方面,而其核心技术便在于它使用的数据存储结构与索引技术。

存储与索引技术概览

在这里插入图片描述

存储结构

  1. 行存储(Row Storage)

    • 特点:数据以行为单位存储,适用于经常进行行级别读取和写入操作的场景,如在线事务处理(OLTP)。
    • 适用场景:业务主要是频繁的小事务操作的 OLTP 系统(如银行交易系统)。
    • 示例
      | ID | Name | Age | City  |
      |----|------|-----|-------|
      | 1  | John | 23  | NY    |
      | 2  | Jane | 29  | LA    |
      
  2. 列存储(Column Storage)

    • 特点:数据以列为单位存储,适用于需要处理大规模数据分析和聚合操作的场景,如在线分析处理(OLAP)。
    • 适用场景:数据仓库、数据分析。
    • 示例
      Columns are stored separately as:
      ID: [1, 2]
      Name: [John, Jane]
      Age: [23, 29]
      City: [NY, LA]
      

索引技术

  1. B+树(B+ Tree)

    • 特点:平衡树,每个节点包含指向子节点的指针和键值,所有数据都存储在叶子节点。
    • 优点:高效的范围查询和排序操作。
    • 缺点:在高并发写入情况下,维护开销较大。
  2. 哈希索引(Hash Index)

    • 特点:使用哈希表结构,以键值对形式存储数据。
    • 优点:适用于精确匹配查询(等值查询)非常高效。
    • 缺点:不支持范围查询。
  3. 位图索引(Bitmap Index)

    • 特点:使用位图表示列的取值,适合低基数数据(即取值种类较少)。
    • 优点:能够快速处理复杂的 AND、OR、NOT 操作。
    • 缺点:对高基数数据不适用,占用较多空间。
  4. 全文索引(Full-Text Index)

    • 特点:针对文本数据进行索引,支持全文检索。
    • 优点:高效处理大文本数据的搜索。
    • 缺点:维护成本高,对存储空间要求较大。
  5. GiST(Generalized Search Tree)

    • 特点:一种可扩展的平衡树结构,适用于各种类型的复杂数据结构和查询需求。
    • 优点:灵活性高,适用范围广(如地理数据、全文搜索等)。
    • 缺点:需要更复杂的实现和维护。
  6. R 树(R-Tree)

    • 特点:用于多维空间数据的索引,如地理信息系统。
    • 优点:对空间范围查询特别高效。
    • 缺点:实现复杂,插入和删除操作可能需要大量重排。

对于常见谓词如等值查询、范围查询,采用 B+树。如 MySQL 的 InnoDB 存储引擎,就默认采用 B+树索引结构,用于支持行存储和常见的范围查询、排序操作。

对于特定的高效查询,如哈希等值查询、位图复杂运算,选用特殊索引。如 PostgreSQL 就支持多种索引,包括 B+树、哈希索引、GiST、GIN(Generalized Inverted Index 用于全文搜索)、SP-GiST(Space-Partitioned Generalized Search Tree)等,以满足不同的查询需求。

下面我们看一下市面上主流关系数据库系统(如 MySQL、PostgreSQL、Oracle、SQL Server)的存储与索引技术是怎么选择和实现的。

MySQL

MySQL 根据用户所选存储引擎的不同,可以有不同的支持,其中最常用的存储引擎是 InnoDB 和 MyISAM。

默认情况下 MySQL 使用 InnoDB(也是最常用的)。它支持事务(ACID 属性),并具有行级锁定和外键支持。MyISAM 则常用于没有事务需求并且读操作远多于写操作的场景下。

存储结构

  • InnoDB

    • 行存储(Row Storage):整个表的一行数据存储在一个连续块中。
    • 数据页:数据存储在数据页(通常为 16KB)中,每页包含多个行。
  • MyISAM

    • 行存储:与 InnoDB 相同。
    • 数据文件与索引文件:每个表有三个文件:数据文件(.MYD)、索引文件(.MYI)和表定义文件(*.frm)。

索引技术

  • InnoDB

    • B+树:InnoDB 使用 B+树作为其默认的索引结构。主键索引(聚集索引)和次级索引(非聚集索引)均使用 B+树。
  • MyISAM

    • B+树:与 InnoDB 相同。

事务与锁

  • InnoDB

    • MVCC(多版本并发控制):通过多个版本的数据行来实现非阻塞读操作。
    • 行级锁定:对单独的行进行锁定,提高了并发性能。
  • MyISAM

    • 不支持事务,也没有行级锁定,而是使用表级锁定。

优势

  • InnoDB

    • 高效的范围查询:B+树在执行范围查询和排序时性能极高。
    • 事务支持:ACID 属性保证了数据的一致性和完整性。
    • 整体读写性能:通过行级锁定和 MVCC 提升了并发读写性能。
  • MyISAM

    • 更小的内存占用:相比 InnoDB,MyISAM 更加轻量,适合只读应用。
    • 较高的读取性能:在没有事务需求并且读操作远多于写操作的场景下,MyISAM 的表现优异。

PostgreSQL

PostgreSQL 是一个对象关系数据库系统,它被设计为扩展性高、符合标准且带有丰富特性的系统。

存储结构

  • 行存储:默认情况下,PostgreSQL 使用行存储。
  • TOAST(The Oversized-Attribute Storage Technique):用于存储大对象或长文本,自动将大字段存储在外部表中。

索引技术

  • B+树

    • 默认索引类型:与 InnoDB 类似,PostgreSQL 默认使用 B+树来进行基本的范围查询和排序。
  • 其他索引

    • Hash 索引:适用于等值查询,但在分布式场景下谨慎使用。
    • GiST(Generalized Search Tree):用于实现全文检索、地理信息系统(GIS)数据索引等。
    • GIN(Generalized Inverted Index):主要用于高效的全文搜索和数组查询。
    • SP-GiST(Space-Partitioned GiST):适用于处理复杂空间数据。
    • BRIN(Block Range INdexes):适用于非常大的表,存储块范围信息以减少全表扫描的开销。

事务与锁

  • MVCC:类似于 InnoDB 的多版本并发控制。
  • 行级锁:支持行级锁定,提高并发操作性能。

优势

  • 拓展性与灵活性:支持多种索引类型以适应不同查询需求。
  • 高性能事务处理:通过 MVCC 和行级锁定实现高效的事务处理。
  • 完整功能支持:丰富的功能集(如存储过程、触发器、派生表、复杂查询语法)使其适合处理复杂的业务逻辑。

Oracle

Oracle 是一种强大的企业级关系数据库管理系统,广泛用于关键的大型业务应用中。

存储结构

  • 行存储(Row Storage):Oracle 主要使用行存储结构,即数据按行存储在数据块中。
  • 分区表(Partitioned Tables):支持对数据表进行水平或垂直分区,以提高查询性能和可管理性。

索引技术

  • B 树索引(B-Tree Indexes)
    • 常规 B 树索引:用于高效的等值和范围查询。
    • 唯一索引:确保列中值的唯一性。
  • 位图索引(Bitmap Indexes):低基数数据列,支持逻辑运算符(AND、OR、NOT)查询。
  • 索引组织表(Index-Organized Tables, IOT):数据按主键索引来存储,类似于聚集索引。
  • 全文索引(Oracle Text):高效检索和全文搜索功能。
  • 反向键索引(Reverse Key Indexes):避免索引热点问题。

事务与锁

  • MVCC(多版本并发控制):通过保存数据的多个版本来支持并发读和写操作。
  • 表级锁、行级锁:提供灵活的锁策略以优化事务处理。

优势

  • 企业级特性:高度可靠、可扩展,适合关键任务应用。
  • 丰富的索引类型:针对不同查询模式和数据特点,提供多种索引选项。
  • 高性能事务支持:使用 MVCC 和灵活锁定策略,提高了并发性能和事务一致性。

SQL Server

SQL Server 是微软的关系数据库管理系统,广泛用于企业解决方案中。

存储结构

  • 行存储(Row Storage):默认采用行存储结构,将行数据存储在数据页中。
  • 列存储(Columnstore Indexes):用于数据仓库和分析需求。

索引技术

  • B+树(Clustered and Non-Clustered Indexes)
    • 聚集索引(Clustered Indexes):数据按索引顺序存储。
    • 非聚集索引(Non-Clustered Indexes):独立于数据存储的次要索引。
  • 全文索引(Full-Text Indexes):文本数据的高效全文搜索。
  • 列存储索引(Columnstore Indexes):大规模数据分析,提供更高的压缩率和查询性能。
  • 地理空间索引(Spatial Indexes):地理信息系统(GIS)数据的高效查询。

事务与锁

  • MVCC(多版本并发控制):通过行版本控制减少并发冲突。
  • 锁级别:支持多种锁定策略,包括行级锁、页级锁和表级锁。

优势

  • 全面功能:提供企业级任务关键的功能,如高可用性、备份恢复和数据安全。
  • 混合负载优化:支持行存储和列存储,使其既适用于事务处理又适用于数据分析。

选型考量

存储结构

  • 行存储优点:适合频繁更新和插入操作,如 OLTP 系统,事务处理频繁。
  • 列存储优点:适合数据分析和聚合操作,如 OLAP 系统,大规模数据的聚合和分析。

索引技术

  • B+树范围查询与排序,B+树在处理范围查询和排序时效率最高。
  • Hash 索引等值查询,Hash 索引在处理等值查询时性能卓越。
  • 位图索引:用于低基数数据的快速逻辑运算查询(Oracle 优秀)。
  • 全文索引:高级文本检索功能(Oracle 和 SQL Server 均提供)。
  • GiST / GIN复杂数据类型支持,如全文搜索、地理数据处理,提升特定类型查询效率。
  • BRIN大数据集的优化,通过块级索引减少了全表扫描的成本。

事务与锁的支持

  • MVCC(多版本并发控制):Oracle、PostgreSQL、SQL Server 和 InnoDB 全部支持 MVCC。
  • 多级锁定策略:主流数据库系统提供的用于优化并发事务处理的锁定策略。

综合因素

  • 效率和性能:B+树的范围查询效率和 B 树索引的一致性保证,位图索引在低基数数据的空间效率,全文索引的文本搜索能力。
  • 灵活性和扩展性:支持多种索引类型和存储方式,以适应不同业务需求。
  • 事务一致性:通过 MVCC 和灵活的锁定策略,保证高并发环境下的数据一致性和完整性。
  • 企业需求:面向不同规模的业务需求和使用场景,提供高可用性、高可靠性和数据安全。

未来趋势

未来数据库技术的发展将以智能化、融合存储、增强分布式和云能力、安全性和隐私保护为主要方向。

  • 智能化数据库系统:利用机器学习和人工智能技术,动态优化查询、索引和数据库参数设置,提高系统整体性能。
  • 融合存储与 HTAP:结合 OLTP 和 OLAP 的优势,支持实时交易处理和数据分析的一体化系统,满足多样化的业务需求。
  • 内存与新型存储技术:利用高速内存和新型存储器件(如 3D XPoint),大幅提升数据访问速度,优化内存数据库的性能。
  • 全球一致性与 Serverless 架构:通过先进的分布式一致性协议和 Serverless 架构,实现高可用、弹性扩展的分布式数据库系统,降低运维成本。
  • 多云策略与跨云互操作:支持多云部署和跨云互操作,提升资源利用率,确保业务连续性和灵活性。
  • 数据安全与隐私保护:采用零知识证明、同态加密等技术,实现数据的全生命周期安全保护,确保数据隐私。

结语

各主流关系数据库在存储结构和索引技术上的选择和实现都是为了满足特定业务需求和性能优化。如 MySQL 的 InnoDB 强在 OLTP 上的应用;PostgreSQL 提供多样的索引类型(B+树、Hash、GiST、GIN 等)和 TOAST 技术,灵活性和扩展性更强,适应复杂查询和高定制化场景中的特殊需求;Oracle 和 SQL Server 在企业级任务关键应用中表现强势。选择合适的关系数据库应根据具体业务需求、查询模式和性能要求等因素综合考量。


PS:感谢每一位志同道合者的阅读,欢迎关注、点赞、评论!


  • 上一篇:布隆过滤器:大数据量下的快速存在性判断
  • 专栏:「数智通识」

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

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

相关文章

【微信小程序】网络数据请求

1. 小程序中网络数据请求的限制 2. 配置 request 合法域名 3. 发起 GET 请求 调用微信小程序提供的 wx.request() 方法,可以发起 GET 数据请求,示例代码如下: 4. 发起 POST 请求 调用微信小程序提供的 wx.request() 方法,可以发起 POST 数据请求,示例代码如下: 5. …

今日头条的账号id在哪里看(网页版)

今日头条的账号id在哪里看(网页版) 1.https://mp.toutiao.com/profile_v4/index2.登录今日头条账号3.设置->头条号ID 1.https://mp.toutiao.com/profile_v4/index 2.登录今日头条账号 3.设置->头条号ID 打开下方链接: https://mp.to…

进程的执行与结束

一、文件的读写 1、fork之前open 子进程会继承父进程已打开的文件相关信息 所以,此时父子进程会影响一个offset值 2、fork之后open 父子进程各自有各自的打开文件的信息,相互之间不会有影响。 二、 进程的执行 //进程运行时,典型场景 1…

量化策略开发步骤系列(3)关键投资组合指标

量化策略开发步骤系列(3)关键投资组合指标 投资组合指标波动性夏普比率最大回撤赢/输百分比每笔交易的平均利润/亏损每期交易次数风险价值(VaR) 这是量化交易系列文章的第二系列——量化策略开发步骤,第一系列请参考专…

Prometheus+Grafana-3-Nginx监控-Redis监控

一、监控Nginx 1.Nginx需要开启stub_status 这里我的nginx容器名为mynignx,进入容器查看。 docker exec -it mynginx bash #进入容器 nginx -v 2>&1 | grep -o with-http_stub_status_module #查看 修改nginx.conf ...location /stub_status {stub_stat…

华为od统一考试B卷【AI面板识别】python实现

思路 n int(input())class Light:def __init__(self, id, x1, y1, x2, y2):self.id idself.x1 x1self.y1 y1self.x2 x2self.y2 y2self.height y2 - y1def get_lights_info(n):lights []for _ in range(n):id, x1, y1, x2, y2 map(int, input().strip().split())lights…

量产工具——复习及改进(后附百问网课程视频链接)

目录 一、函数的使用 1.显示系统 1.1 mmap函数 2.输入系统 2.1 ts_setup()函数 2.2 ts_read()函数 2.3 socket()函数 2.4 bind()函数 2.5 recvfrom()函数 2.6 inet_aton()函数 2.7 sendto()函数 2.8 pthread_create()函数 2.9 pthread_cond_signal()函数 2.10 pthre…

思科路由器的基本配置1

#路由技术基础# #路由器的基本配置1# #1调整超级终端的参数 #2退出配置向导,输入“NO”即可进入正常配置方式 #3路由器的模式切换 Router> !进入用户模式 Router>enable !进入特权模…

opencv-python实战项目一:获取鼠标框选区域的颜色

文章目录 一:简介二:框选区域选择颜色方案三、算法实现步骤3.1 按鼠标事件截取图像3.2将图像模糊后转化为hsv并求均值3.3 判断hsv处于何种颜色 四:整体代码实现五,效果: 一:简介 在计算机视觉领域,颜色检测…

19-ESP32-C3加大固件储存区

1默认编译情况。 2、改flash4M。ESP-IDF Partition Table Editor修改。 3、设置输入Partition Table 改自定义.CSV。保存。 4、查看命令输入Partition Table Editor打开-分区表编辑器UI。按图片增加。 nvs,data,nvs,0x9000,0x6000,, phy_init,data,phy,0xF000,0x1000,, factory…

计算机毕业设计Hadoop+Hive居民用电量分析 居民用电量可视化 电量爬虫 机器学习 深度学习 大数据毕业设计 Spark

《Hadoop居民用电量分析》开题报告 一、研究背景与意义 能源问题在全球范围内一直是热点议题,尤其是随着居民生活水平的提高和城市化进程的加快,居民用电量急剧增长,对电力系统的稳定运行和能源管理提出了更高要求。如何科学合理地管理和分…

Hive3:识别内部表、外部表及相互转换

一、识别方法 查看内部表信息 desc formatted stu;查看外部表信息 desc formatted test_ext1;通过Table Type对应的值,我们可以区分外部表和内部表。 二、相互转换 内部表转外部表 alter table stu set tblproperties(EXTERNALTRUE);外部表转内部表 alter ta…

PCIe学习笔记(21)

读请求的数据返回(Data Return for Read Requests) •针对内存读取请求的单个完成可能提供少于请求的全部数据量,只要对于给定请求的所有完成在组合起来时返回了读取请求中请求的数据量。 ◦不同请求的完成不能合并。 ◦I/O和Configuratio…

Qt QCustomPlot 图形库详解

文章目录 原文1. 下载qcustomplot.h与qcustomplot.cpp后,将代码文件拷贝到本地工程,并添加到工程项目2. 看到文件后就是添加成功了3. 在界面中拖拽一个Widget控件,选中并右键选中“提升为”,将原来的Widget控件已成为一个带坐标的 CustomPlot 控件4. 添加printsupport原文 …

【Ai学习】一个技巧,解决99%Comfyui报错!

前言 comfyui以极高灵活度及节点化工作流,深受AI绘画者追捧,每当新的模型开源,comfyui都是最先进行适配。 comfyui高度兼容性及灵活性带来丰富强大的扩展(插件)生态,同时也带来一系列插件安装的问题&…

Python程序结构

模块 Module 定义:包含一系列数据、函数、类的文件,通常以.py结尾。 作用:让一些相关的数据,函数,类有逻辑的组织在一起,使逻辑结构更加清晰。 有利于多人合作开发。 导入 import 语法: im…

【目标检测实验系列】YOLOv5/YOLOv8改进:CARAFE轻量级上采样算子,聚合上下文信息,助力模型涨点(文内附源码)

1. 文章主要内容 本篇博客主要涉及轻量级上采样算子CARAFE,将YOLOv5/YOLOv8模型中最近邻上采样算子改为CARAFE算子,使模型聚合上下文信息,助力模型涨点。 2. 简要概括 论文地址:CARAFE论文地址 论文Github代码&#xff1a…

Go语言 Defer(延迟)

本文主要内容为Go语言中defer(延迟)介绍及应用文件读取使用defer的示例。 目录 定义 应用场景 代码示例 改为匿名函数 总结 定义 延迟:关键字,可以用于修饰语句、函数, 确保这条语句可以在当前栈退出的时候执行。 应用场景 1.一般用于…

【leetcode】特殊数组I【(炒鸡)简单】

好像这题没啥子好说的欸&#xff0c;那就祝点进来的友友今天有好事发生叭~ AC代码见下&#xff1a; class Solution { public:bool isArraySpecial(vector<int>& nums) {for(int i1; i<nums.size(); i)if(nums[i]%2 nums[i-1]%2) return false;return true;} }…

如何妙用哈希表来优化遍历查找过程?刷题感悟总结,c++实现

先上题目 题目链接&#xff1a;题目链接 这题我最先想到的就是前缀和a&#xff0c;构造好了以后就遍历每一个[l,r]数组&#xff08;满足题目要求的连续区间数组&#xff09;&#xff0c;奈何倒数第二个样例时间超限 先给出原思路代码 class Solution { public:int subarray…