MySQL的数据结构B+tree以及SQL优化

news2024/10/2 12:30:38

首先呢,我们知道MySQL的数据结构为B+tree,那么其结构究竟是什么样的,为什么选择B+tree,而不选择Btree。下面我们从其结构分析

1.Btree平衡多路查找树

B-tree结构的数据可以让系统高效的找到数据所在的磁盘块。为了描述B-Tree,首先定义一条记录为一个二元组(key,data),key记录键值,对应表中的主键值,data为一行记录中除主键外的数据。对于不同的记录,key值互不相同

        仔细观察:B-Tree的每个节点占用一个盘块的磁盘空间,一个节点上有两个升序排序的关键字和三个指向子树根节点的指针,指针存储的是子节点所在磁盘块的地址。两个关键词划分成的三个范围域对应三个指针指向的字数的范围域。

        以图中根节点为例:p1:指向小于17的范围域

                                        p2:指向大于17,小于35的范围域

                                        p3:指向大于35的范围域

其,查找数据时,需要多次将数据读取到内存。

2.B+Tree

所有的叶子节点中包含可全部关键字的信息,非叶子节点只存储键值信息,及指向含有这些关键字记录的指针,且叶子节点本身依关键字的大小自小而大的顺序链接,所有的非终端节点可以看成是索引部分,节点中仅含有其子树根节点中最大(或最小)关键字。(而B树的非重点节点也包含需要查找的有效信息)

       1.所有叶子节点之间都有一个链指针

        2.数据记录都存放在叶子节点中

 仔细观察:B+Tree和B-Tree结构差异,其所有的叶子节点包含了全部关键字信息,非叶子节点只存储键值信息,及指向含有这些关键字记录的指针。并且叶子节点本身依照关键字的大小,自小而大的顺序链接,所有的非终端节点可以看成索引部分,结点中仅含有其子树根节点中最大或最小的关键字(B-Tree的非终结点也包含需要查找的有效信息)

        1.所有的叶子节点之间都有一个链指针。

        2.数据记录都存放在叶子节点中

3.B+Tree 和B-Tree的区别?

        1.数据存储位置:

                       B+Tree:所有的数据记录都存储在叶子节点。非叶子节点仅包含键值,用于指导搜索路径

                        B-Tree:数据可以存储在非叶子节点和叶子节点。每个节点包含一组键值对,这些键值对按顺序排列

        2.节点结构:

                        B+Tree:每个非叶子节点包含多个键值和相同数量的子节点指针,叶子节点除了包含数据记录外,还包含指向相邻叶子节点的指针

                        B-Tree:每个节点包含多个键值对和多个子节点指针。节点内的键值对和节点指针数量之间存在一定的关系,以保持平衡

        3.搜索性能:

                        B+Tree:搜索性能只需要访问叶子节点,由叶子节点形成一个链表,搜索过程中可快速遍历所有值

                        B-Tree:搜索操作可能需要访问非叶子节点,搜索路径上的每个界定都需要比较和跳转。

        4.插入和删除操作:

                        B+Tree:插入和删除更新键值和指针信息操作仅影响叶子节点,非叶子节点仅需要

                        B-Tree:插入和删除可能会导致节点分裂或合并,维护树的平衡

        5.应用场景:

                        B+Tree:适合需要频繁搜索,插入和删除操作的场景,如数据库索引。由于所有数据都在叶子节点,B+Tree在范围查询和排序方面更有优势

                        B-Tree:适合需要快速访问中间节点数据的场景,如文件系统中的目录结构

SQL优化 的优化策略:

        1.三大范式:

                第一范式:强调列的原子性。即数据库每列都是不可分割的原子数据项

                第二范式:要求实体的属性完全依赖主键,即在满足第一范式的基础上

                第三范式:要求实体的属性和主键直接相关依赖,而不是间接

       设计数据库表的原则:

        1.数据表的个数越少越好

        2.数据表中的字段个数越少越好

        3.数据表中联合主键的字段个数越少越好

        4.使用主键和外键越多越好

优化原则:

SQL语句编写的优化:

        1.【强制】:程序段select语句必须指定具体字段名称,禁止携程*

        【建议】:

        1.程序段insert语句指定具体字段名称,不要写成insert into t1 values(...)

        2.除静态表或小表(100行以内),DML语句必须有where条件,且使用索引查找

        3.insert into t1 values(...),(....)...  ,  多条数据插入时,建议值不要超过500个,值过多,虽然上线快,但会引起主从同步延迟

        4.select 语句不要使用union,推荐使用union  all 并且union子句个数限制在5个以内

        5.线上环境,多表了连查join,不要超过5个表

        6.减少使用order  by ,和业务沟通,尽量将排序放到程序段去做,Order by  group by, distinct 这些语句较为耗费CPU,数据库的CPU资源及其宝贵

        7.包含order by ,group by,distinct这些查询语句,where 条件过滤出来的结果集请保持在1000行以内,否则sql会很慢

        8.对单表的多次alter 操作必须合并为一次

        对于超过100w 行的大表进行alter table 必须经过DBA 审核,并在业务低峰期执行,多个alter 需整合在一起,因为alter table会产生表锁,期间阻塞对于该表的所有写入,对于业务可能会产生极大影响

        9.批量操作数据时,需要控制事务处理间隔时间,进行必要的sleep

        10.事务里包含SQL语句不超过5个

        因为过长的事务会导致锁数据较久,MySQL内部缓存,连接消耗过多等问题

        11. 事务里更新语句尽量基于主键或Unique key,如update。。。。where id=xxx;

        否则会产生间隙锁,内部扩大锁定范围,导致系统性能下降,产生死锁。

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

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

相关文章

入门mem0.NET

入门mem0.NET 安装包 如果你的项目使用了EntityFrameworkCore,那么你可以跟随这个教程走 <ItemGroup><PackageReference Include"mem0.NET" Version"0.1.7" /><PackageReference Include"mem0.NET.Qdrant" Version"0.1.7…

云动态摘要 2024-08-04

给您带来云厂商的最新动态&#xff0c;最新产品资讯和最新优惠更新。 最新优惠与活动 数据库上云优选 阿里云 2024-07-04 RDS、PolarDB、Redis、MongoDB 全系产品新用户低至首年6折起&#xff01; [免费体验]智能助手ChatBI上线 腾讯云 2024-07-02 基于混元大模型打造&…

java之IO篇——File、字节流、字符流

前言 IO流是用于读写文件中的数据&#xff0c;要读写文件之前可以创建文件获取文件对象再创建IO流&#xff0c;正文会先介绍File类&#xff0c;通过File类的构造方法获取文件的对象&#xff0c;创建文件或目录以及File类的一些方法获取文件对象的属性。后面还介绍了相关的IO流体…

Radxa ROCK 3C开发板编译Opencv,支持调用树莓派摄像头模块V2

目录 1、ROCK 3C和树莓派摄像头模块V2介绍2、ROCK 3C在rsetup开启支持3、测试指令4、编译Opencv4.1 增加swap&#xff0c;确保内存够用4.2 安装依赖和下载opencv4.3 编译参考链接 5、使用opencv调用树莓派摄像头模块V2 1、ROCK 3C和树莓派摄像头模块V2介绍 ROCK 3C 是一款基于…

刷题篇 - 01

目录 题目一&#xff1a; 题目二&#xff1a; 题目三&#xff1a; 题目四&#xff1a; 题目五&#xff1a; 题目六&#xff1a; 题目七&#xff1a; 题目一&#xff1a; 387. 字符串中的第一个唯一字符 - 力扣&#xff08;LeetCode&#xff09; public int firstUniqC…

订单定时状态处理业务(SpringTask)

文章目录 概要整体架构流程技术细节小结 概要 订单定时状态处理通常涉及到对订单状态进行定期检查&#xff0c;并根据订单的状态自动执行某些操作&#xff0c;比如关闭未支付的订单、自动确认收货等. 需求分析以及接口设计 需求分析 用户下单后可能存在的情况&#xff1a; …

鸿蒙(API 12 Beta2版)NDK开发【内存管理purgeable内存开发指导】

场景介绍 HarmonyOS提供Purgeable Memory内存管理机制&#xff0c;开发者可以使用相关接口创建PurgeableMemory对象&#xff0c;从而管理purgeable内存。 开发者可以通过本指导了解在HarmonyOS应用中&#xff0c;如何使用Native层相关接口操作purgeable内存。功能包括purgeab…

Jupyter-Notebook常用操作看这一篇就够啦

来源&#xff1a; “码农不会写诗”公众号 链接&#xff1a;Jupyter-Notebook常用操作看这一篇就够啦 文章目录 01 概括02 快捷键总结03 运行外部python文件04 魔法命令4.1 运行计时4.2 查看变量与函数4.3 其它常用指令 书接上文 Jupyter-Notebook是一个基于 Web 的交互式开发环…

第十四节、受伤、死亡的逻辑和动画

一、受伤的动画效果 1齿轮控制当前动画图层的权重 2、层级 当前动画层为add&#xff0c;所以不会覆盖之前的动画层&#xff0c;而是添加一个动画层 3、受伤闪烁 调用颜色的值&#xff0c;实现受伤闪烁 4、录制动画 点击时间轴&#xff0c;插入关键帧 伤害图层选择add&…

2024华数杯C题解题思路、参考论文已出(无偿分享)~

C题&#xff1a;老外游中国 “数模加油站”团队出品~ 问题1&#xff1a; 解题思路&#xff1a; 1、数据准备&#xff1a; 导入352个城市的csv文件&#xff0c;提取每个城市中的100个景点的信息。 将每个景点的评分数据提取出来&#xff0c;形成一个包含35200个景点评分的列…

centos虚拟机restart网络后隔一会断联

1. 前言 不知道各位有没有遇到过虚拟机网络设置的坑&#xff0c;往往前一段时间用的好好的&#xff0c;突然网络又不行了无法连接外部网络&#xff0c;而且使用 service network restart 一瞬间可以&#xff0c;但是过一会就断连了… 2. 解决方案 根据对虚拟机网络的学习了解…

五、一个quad同时支持pcie和sfp两种高速接口的ref时钟配置

项目描述 上位机将截图数据通过 XDMA 写入到 FPGA 侧的 DDR 内存区域 1 中通过 axi_lite 接口给 axi_read_start 信号&#xff0c;通知 AXI_read 模块启动读取数据&#xff0c;然后通过 GTP TX 模块发送出去。经过光纤回环&#xff0c;GTP RX 端接收到数据&#xff0c;送给 AX…

今天的一件小事,亲身感受:付费是提高效率的重要途径

今天需要修改一个单页网站源码&#xff0c;有一个小问题困住我3个小时了。 毕竟我也不是专业的&#xff0c;没有系统学习过这些&#xff0c;搜答案都不知道怎么搜哈哈 吃过午饭&#xff0c;想着不能这么耗下去了&#xff0c;于是及时去了某宝&#xff0c;找到一个修改代码的 …

搭建nexus上传jar包,并结合jenkins运行项目

一、搭建nexus 1、docker拉取镜像 需要将docker原更新一下 https://blog.csdn.net/qx020814/article/details/140908006?spm1001.2014.3001.5502 docker pull sonatype/nexus3 创建nexus挂载文件、增加权限&#xff1a; mkdir docker_nexus3 mkdir docker_nexus3/nexus-data c…

TreeSize:免费的磁盘清理与管理神器,解决C盘爆满的燃眉之急

目录 TreeSize&#xff1a;免费的磁盘清理与管理神器&#xff0c;解决C盘爆满的燃眉之急 一、TreeSize介绍 二、下载安装TreeSize 2.1、下载地址 2.2、下载步骤 ​2.3、安装步骤 三、professional版的TreeSize试用 3.1、分析磁盘空间 3.2、显示拓展名统计信息 3.3、显…

将本地的业务写成成可供RPC远程调用的方法

第一步&#xff1a;首先我们先定义proto文件&#xff0c;这些proto文件将会为远程调用者提供调用的方法&#xff0c;为login方法。 2.重写UserServiceRpc类中的Login方法。 在Login中做的操作主要是&#xff0c;得到requst里面的参数&#xff0c;然后调用本地的Login方法&#…

可解释性终极追问,什么才是第一性解释?20篇CCF-A+ICLR论文给你答案

一、前言 长期以来&#xff0c;我们团队一直在思考可解释性领域的一个终极问题&#xff0c;即什么才是解释性领域的第一性原理&#xff1f;所谓第一性原理&#xff0c;目前没有一个被广泛接受的框架&#xff0c;世上本无路&#xff0c;我们需要逐渐去定义这样一个路。我们需要在…

Linux系统中的高级内核模块调试技术

引言 在Linux系统中进行高级内核模块开发时&#xff0c;调试是不可或缺的重要环节。调试技术能够帮助开发人员发现和解决代码中的错误和问题&#xff0c;提高开发效率和代码质量。本文将深入探讨Linux系统中高级内核模块调试的技术和方法&#xff0c;包括常用的调试工具、调试…

JAVA—面向对象编程高级

学习了一定基础后&#xff0c;开始更加深入的学习面向对象&#xff0c;包含static,final两个关键字&#xff0c;面向对象编程三大特征之继承和多态。以及对于抽象类&#xff0c;内部类&#xff0c;接口&#xff0c;枚举&#xff0c;泛型的学习。 目录 1.static &#xff08;…

cdn 内容分发网络

cdn 内容分发网络 CDN的全称是Content Delivery Network&#xff0c;即内容分发网络。 其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节&#xff0c;使内容传输得更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层…