数据库内核-基础知识

常用索引:

介绍:


哈希表:数组加链表,取字段Hash值做Key,
B树:    树形结构,排序后N分查找
B+树:  树形结构,仅叶子结点存放数据
跳表索引:链表+链表,相当于一级链表基础上做了二级链表索引
bitmap:数组存放0-1结构10进制值。数组Key为桶Index,Value为10进制数值,10进制数值转为2进制,通过2进制0-1 位数是否为1 判断该值是否存在。

总结:

哈希索引用来提高点查询效率
B 树索引用来提高范围查询
B 树索引对高并发支持的诟病,引入跳表索引
针对基数较小的列,引入位图索引(bitmap)

SQL基础执行流程:

SQL->Parser->AST->Binder get meta ->Bounded AST -> Optimizer -> Physical Plan -> Executor -> ResultSet

Binder:绑定器,获取meta 并进行元数据判断,库表字段是否为可执行语义判断

Optimizer:优化器,首先生成基础逻辑执行计划。各种优化器

执行树上的每个节点,称为逻辑操作符(logical operator)
每个逻辑操作符扩展出物理操作符(physical operator)

代码运行时,自底向上
物理操作符调用具体执行方法,例如:
    扫描:
        全表扫描
        hash索引扫描
        B树扫描
    GroupBy
        HashGroupBy
        SortGroupBy

读取模式

        1.基础实现模式: 读取所有数据,加载至内存。但是容易OOM

        2.迭代模式:利用流式逻辑,Producer&Consumer 理念,上层节点通过获取一个个Tuple,来实现资源控制。但不适合order by。

        3.向量化模式:  迭代模式基础上,按批次处理数据,减少操作符交互。利用处理器SIMD,提高处理速度。更适合OLAP

        SIMD: 一条命令,在一组数据中分别执行相同的操作。即处理器的并行技术。

        对于子节点读入,首先创建哈希表。读取结束以后,输出哈希表Key-Value

如何避免OOM?

        中间数据集 溢出至磁盘(外部归并排序 算法实现,分段合并)

聚合

单项聚合:结果为一个值, Count  或 Sum

组队聚合:结果为,Key,Count() ,即按Key聚合结果

聚合统计过程为:依次扫描数据,不断更新聚合结果集。

Join

Join 类型:

        双层迭代:
        SortMerge:

                1.Shuffle 阶段。两个数据集根据Join字段shuffle,相同的key位于同一个分区
                2.Sort 阶段。根据Join字段进行排序
                3.Merge 阶段。进行merge。实际需要考虑不同Join类型带来的算法差异、单Key数据倾斜导致以及支持spill

        HashJoin:

                1.Broadcast Hash Join :大表Join小表,Build Side小表广播给Probe Side
                2.Shuffle Hash Join   :大表Join大表,两个表都需要进行Hash Exchange操作。Probe Side加载 Build Side对应的Partition数据到内存中,因而在表较大时,需要增加Partition数来避免内存OOM问题;但如果存在Partition数据倾斜,解决内存OOM问题就会更加困难。

        

优化器:

Query Rewrite (语句重写)

        在不影响执行结果的情况下,改写SQL,剔除一些无意义的查询。

Join优化

        优化器的主要职责是,在资源限制内(计算资源或者优化时间),找到尽可能足够好的执行计划

启发式算法

        左侧深度遍历: 不断的LeftJoin

                优点:左表小,可以一直放在内存,右表只需全表扫描即获取结果

                缺点:单一Join ,不支持并行处理

Cardinality Estimation 基数估算

        条件:

                1. 知道表的总行数

                2. 知道每个字段的distinct value

        功能:

                对于计划A的输出条数预测

        目的:

                它通过预测 selection cardinality 和 join cardinality 来帮助决定 join ordering

Cost Model


根据输入输出的cardinality 和cost公式,对每一个Physical operator赋值一个Cost(该Operator执行时间)

Optimizer
将所有operator的cost相加,total cost最小为最优执行计划

事务

一个事务是一组对数据库中数据操作的集合。无论集合中有多少操作,对于用户来说,只是对数据库状态的一个原子改变。

具有原子性(atomicity),一致性(consistency),隔离性(isolation),以及持久性(durability)。

完整事务操作


begin(开启事务), commit(提交事务), rollback(回滚事务)

事务隔离性

 隔离级别:
    read uncommitted(读未提交),事务1可读取事务2 读未提交的数据。没有锁,但因为是未提交数据,所以结果有误差
    read committed(读提交),事务1可读取事务2 已经提交的数据。因为数据更新问题(已有value1-> 事务A读取value1 ->事务B更改提交value2 -> 事务A读取到value2, 前后结果不一致,因为没加锁)。
    repeatable read(可重复读),事务1只能读取事务2已经提交的数据,且可以重复查询这些数据,读期间加锁,数据不可更改
    

隔离实现方法:

        1.两阶段加锁:

                事务加锁释放锁分为两个阶段:
                    1.获取锁阶段,事务只能不断地获取新的锁,但不能释放锁。
                    2.释放锁阶段,事务只能逐渐释放锁,并且无权再获取新的锁
                定义不同类型的锁,以及它们之间的兼容程度来获得更细粒度的控制。    
                    共享锁(只读锁)
                    独占锁(可读可写)
                两个事务,两个独占锁内调用对方数据产生死锁,则其中一个事务回滚释放

        2.时间戳:

                按事务时间戳执行

        3.多版本时间戳

                时间戳与版本结合, 生成新版本数据

        4.多版本两阶段加锁

                两阶段加锁与版本结合,生成新版本数据

        5.快照

                类似于版本,如被修改,则回滚快照

整理来源:

数据库内核杂谈_技术洞察_技术趋势_大厂实践_InfoQ精选专题

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

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

相关文章

【YashanDB知识库】kettle从DM8的number类型同步到YashanDB的varchar类型,存入是科学计数法形式的数据

【标题】kettle从DM8的number类型同步到YashanDB的varchar类型,存入是科学计数法形式的数据 【问题分类】数据导入导出 【关键字】数据同步,number类型,科学计数法 【问题描述】客户查询不到准确数据,只看到科学计数法展示的字…

【FISCO BCOS 3.0】一、新版本搭链介绍

目录 一、区块链种类的变化 二、搭链演示 1.单群组区块链(Air版本) 2.多群组区块链(Pro版本) 3.可扩展区块链(Max版本) FISCO BCOS的发展速度如日中天,对于稳定的2.0版本而言,偶…

058.最后一个单词的长度

题意 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 难度 简单 示例 1: 输入:s "Hello World" 输…

Linux通过 SSH 使用 rsync 进行文件传输

目录 目的整体思路ssh建立连接A服务器上的操作输入 ssh-keygen 生成密钥对查看公钥 B服务器上的操作设置公钥认证 A服务器上的操作使用SSH登录进行测试 同步数据知识拓展SSH(Secure Shell)rsync(Remote Sync) 目的 使用SSH&#…

JavaWeb基础(一)-IO操作

Java I/O工作机制: 注:简要笔记,示例代码可能较少,甚至没有。 1、Java 的 I/O 类库的基本架构。 ​ Java 的 I/O 操作类在包 java.io 下,大概有将近80个类,这些类大概可以分为如下四组。 基于字节操作的…

UE5中绘制饼状图

饼状图 使用UE绘制前提完整的创建过程123456678 附录代码.h代码.c代码 使用UE绘制前提 EPIC Game使用的版本是Unreal Engine 5.0.3。 没有使用其他额外的插件,使用的是C和Ui共同绘制。 C编译器使用的是VS2019。 完整的创建过程 1 首先在UE中随意一种项目的白色。…

服务器端请求伪造--SSRF

SSRF 简介 ##SSRF定义 SSRF(Server-Side Request Forgery:服务器端请求伪造)是一种由 攻击者构造形成,由服务端发起请求 的一个安全漏洞。一般情况下,SSRF攻击的目标是从 外网无法访问的内部系统(正是因为它是由服务端发起的,所…

一个小技巧轻松提升量化精度!IntactKV:保持关键词元无损的大语言模型量化方法

目录 摘要关键词元(Pivot Tokens)方法概述实验验证1. 权重量化2. KV Cache 量化3. 权重和激活值量化 参考文献 本文介绍我们针对大语言模型量化的工作 IntactKV,可以作为插件有效提升 GPTQ、AWQ、QuaRot 等现有主流量化方法效果。论文作者来自…

海外社媒账号如何运营安全稳定?

由于设备与网络原因,通常一个海外社媒账号尤其是多账号的稳定性都有一定限制,错误的操作或者网络都可能使得账号被封,前功尽弃。本文将为大家讲解如何通过IP代理来维持账号稳定与安全,助力海外社媒矩阵的搭建。 一、社媒账号关联…

C++ ─── string的完整模拟实现

本博客实现了string的常见接口实现 下面是用到的一些函数&#xff0c;供大家回顾复习 string.h #define _CRT_SECURE_NO_WARNINGS 1 #pragma once #include<iostream> #include<assert.h> using namespace std;namespace bit {class string{public:typedef char*…

深入理解计算机系统 家庭作业4.52

练习题4.3 p.254 \sim\seq\seq-full.hcl文件内已经说的很清楚了哪些不能更改,哪些是题目要求更改的控制逻辑块. 依据家庭作业4.51的答案,在seq-full.hcl文件内更改对应的HCL描述即可 以下答案注释了#changed的就是更改部分 #/* $begin seq-all-hcl */ ######################…

Redis 中 Set 数据结构详解

用法 Redis 中的 Set 是一个无序&#xff0c;不重复集合&#xff08;里面的元素为字符串&#xff09;&#xff0c;支持常用的集合操作。 常见命令 1. 增 添加一个或多个元素到 set 中 SADD key member [ member ... ] 返回值&#xff1a; 添加成功的元素个数 将一个元素移到…

数据结构(1):线性表

1 线性表的顺序实现 创建的新项目是cpp类型哦&#xff01; 1.1 初始化 1.1.1 静态分配 #define _CRT_SECURE_NO_WARNINGS#include <stdio.h> #define MaxSize 10 //定义顺序表的长度 typedef struct {int data[MaxSize];//用静态的数组存放元素&#xff01;int lengt…

在Java中实现多线程之间的通信

一、技术难点 在Java中实现多线程之间的通信是一个复杂但重要的任务&#xff0c;它涉及到线程同步、数据共享和线程间协作等多个方面。以下是实现多线程通信时可能遇到的一些技术难点&#xff1a; 线程同步&#xff1a;多线程环境下&#xff0c;多个线程可能同时访问和修改共享…

【UE5.1 角色练习】08-物体抬升、抛出技能 - part2

目录 前言 效果 步骤 一、让物体缓慢的飞向手掌 二、向着鼠标方向发射物体 前言 在上一篇&#xff08;【UE5.1 角色练习】08-物体抬升、抛出技能 - part1&#xff09;的基础上继续完成角色将物体吸向手掌&#xff0c;然后通过鼠标点击的方向来发射物体的功能。 效果 步骤…

STEP 7-MicroWIN SMART

“STEP 7-MicroWIN SMART”是西门子公司为其S7-200 SMART系列PLC&#xff08;可编程逻辑控制器&#xff09;设计的编程软件。这款软件以其直观的操作界面和强大的功能&#xff0c;在工业自动化领域被广泛应用&#xff0c;特别是在小型自动化系统的开发和控制中表现出色。以下是…

滑动窗口模板(Java)

题目描述 有一个长为 &#x1d45b; 的序列 &#x1d44e;&#xff0c;以及一个大小为 &#x1d458; 的窗口。现在这个从左边开始向右滑动&#xff0c;每次滑动一个单位&#xff0c;求出每次滑动后窗口中的最大值和最小值。 例如&#xff0c;对于序列 [1,3,−1,−3,5,3,6,7] …

【Linux 网络编程】网络的基础知识详解!

文章目录 1. 计算机网络背景2. 认识 "协议" 1. 计算机网络背景 网络互联: 多台计算机连接在一起, 完成数据共享; &#x1f34e;局域网&#xff08;LAN----Local Area Network&#xff09;: 计算机数量更多了, 通过交换机和路由器连接。 &#x1f34e; 广域网WAN: 将…

uniapp通过Canvas绘制网格(心电图,坐标纸等可用)

本篇文档是Canvas绘制心电图的第一个部分&#xff0c;想了解详情的可以关注后学习交流。 心电图的最底层需要一个网状底层&#xff0c;来方便进行数据的测量。 一、白底分大、中、小三个区域的网格 1、首先是HTML部分 <!DOCTYPE html> <html lang"en">…

包和final

一.什么是包&#xff1f; 包就是文件夹,用来管理各种不同功能的Java类,方便后期代码维护。 二.包名的规则 公司域名反写包的作用,需要全部英文小写&#xff0c;见名知意。 com.xxx.domain domain:这个包是干什么的。 三.使用其他类的规则 1.使用同一个包中的类时,不需要导…