数据库内核-基础知识

news/2024/9/23 17:42:26/

常用索引:

介绍:


哈希表:数组加链表,取字段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.ppmy.cn/news/1464229.html

相关文章

图形学初识--空间变换

文章目录 前言正文矩阵和向量相乘二维变换1、缩放2、旋转3、平移4、齐次坐标下总结 三维变换1、缩放2、平移3、旋转绕X轴旋转:绕Z轴旋转:绕Y轴旋转: 结尾:喜欢的小伙伴可以点点关注赞哦 前言 前面章节补充了一下基本的线性代数中…

使用python绘制一个五颜六色的爱心

使用python绘制一个五颜六色的爱心 介绍效果代码 介绍 使用numpy与matplotlib绘制一个七彩爱心! 效果 代码 import numpy as np import matplotlib.pyplot as plt# Heart shape function def heart_shape(t):x 16 * np.sin(t)**3y 13 * np.cos(t) - 5 * np.cos…

小红书引流获客软件,轻松成为爆款达人

在这个信息爆炸的时代,小红书凭借其独特的内容分享社区模式,迅速成为了品牌和个体创业者不可忽视的营销宝地。作为一个集生活方式分享、购物心得、美妆教程、旅行攻略等于一身的平台,小红书聚集了大量追求品质生活的年轻用户群体。对于想要在…

LeetCode 63.不同路径Ⅱ

思路&#xff1a; 在有障碍物的地方增加一个判断即可 class Solution { public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int dp[105][105];int mobstacleGrid.size();int nobstacleGrid[0].size();for(int i0;i<m;i){for(int j0…

Linux安装zsh并配置oh-my-zsh

配置oh-my-zsh 查看当前shell安装zsh切换到zsh配置ohmysh 查看当前shell cat /etc/shells# /etc/shells: valid login shells /bin/sh /bin/bash /usr/bin/bash /bin/rbash /usr/bin/rbash /bin/dash /usr/bin/dash安装zsh sudo apt install zsh# /etc/shells: valid login s…

AWS迁移与传输之Migration Hub

AWS Migration Hub是一种集中化的迁移管理服务&#xff0c;可帮助企业规划、跟踪和管理在亚马逊云中进行的各种迁移活动。包括应用程序迁移、数据库迁移、服务器迁移等。 AWS Migration Hub (Migration Hub) 提供一个位置来跟踪使用多个 AWS 工具和合作伙伴解决方案的迁移任务…

前端---闭包【防抖以及节流】----面试高频!

1.什么闭包 释放闭包 从以上看出&#xff1a;一般函数调用一次会把内部的数据进行清除--但是这种操作却可以一起保留局部作用域的数据 // 优点:1、可以读取函数内部的变量 2、让这些变量始中存在局部作用域当中 2.闭包产生的两种业务场景&#xff1a;防抖、节流 2.1防抖 举…

浅谈MySQL事务

目录 一&#xff0c;事务的引入 上述的特性叫做“原子性”&#xff08;事务最核心操作&#xff0c;事务还具备别的性质在下文&#xff09;&#xff1b; 二&#xff0c;日志体系 三&#xff0c;事务的使用 四&#xff0c;事务的基本特性 1.脏读&#xff1a; 2.不可重复读 …