首页 > 数据库 >MysqlB树、B+树索引原理、性能优化原理、

MysqlB树、B+树索引原理、性能优化原理、

时间:2023-01-31 16:03:16浏览次数:50  
标签:存储 节点 叶子 索引 MysqlB 原理 数据 主键

Mysql索引为什么选择B+树这种数据结构

1、二叉树无法解决单边增长的问题。

2、红黑树虽然可以通过节点旋转来达到节点自动平衡的问题、但无法有效控制树的高度。

3、B树、B+树

B树、B+树区别

相同点

每个数据页的节点都是从左到右依次递增的

不同点

  • B树数据都存储在对应的每个索引节点上且不会做冗余处理、B+树数据只存储在叶子节点上(叶子节点包含有所有的索引数据、其余非叶子节点都是冗余节点)
  • B树叶子节点的每个数据页之间没有关联、B+树叶子节点之间通过指针进行双向关联、这种关联可以大大提高范围查找的效率

Mysql中查询数据页的大小、系统默认分配的数据页的大小为16KB、不建议修改。

SHOW GLOBAL STATUS LIKE 'Innodb_page_size'

为什么系统设置的数据页的大小是16KB

因为数据页节点会被加载到内存中、如果设置过大会导致内存溢出的问题、16KB的数据页大小可以存放16 * 1024 / (8+6) = 1770

(按照索引的数据类型为Bigint占用8个字节, 地址在C语言中占用6个字节)

叶子节点因为会携带数据、暂时认为一个叶子节点的大小为1KB(正常情况下一行数据大小不会超过1KB)、一个叶子数据页可以存储16个索引

一个深度为3的B+树可以存储 1170 * 1170 * 16 = 21,902,400个索引数据、且每次查找最多只需要3次IO。

B+树的高度是由每个非叶子节点能存储多少个索引元素决定的。

什么是聚集索引/聚簇索引

  • 聚集索引/聚簇索引:叶子节点包含了完整的数据记录------Innodb(索引和数据存储在一起)
  • 非聚集索引:叶子节点只保存数据行的地址-------mylsam(索引和数据分开存储、MYD、MYI)

建表时为什么建议我们设置主键

INNODB创建表时、如果不创建主键mysql会检测其余不存在重复数据的列、利用不存在重复数据的数据列自动创建B+树、如果没有这样的列、mysql会自动创建一列隐藏列、利用该隐藏列来维护该表的B+树

为什么Mysql推荐我们使用自增长的主键

  • 很多时候hash索引要比B+树索引更高效、但时hash索引仅能满足“=”, “in”, 不支持范围查找、除此之外还会产生hash冲突
  • 因为自增的主键可以有效避免创建索引时索引元素的重新排序、B+树的重新平衡、从而提高插入数据的效率。

Mylsam的主键索引和普通索引的存储方式一样

Innodb的主键索引和普通索引的存储方式不一样

Innodb中的普通索引存储的不是行数据而是对应行聚集索引(主键)

为什么非主键索引结构叶子节点存储的是当前行的聚集索引(主键)

  • 出于索引结果一致性、如果都存储数据、当每次insert时必须得向两个索引树插入索引后才能成功、存储聚簇索引时则只需要聚簇索引树插入成功就算insert成功
  • 节省存储控空间的考虑

联合索引

1、最左前缀原理(左列原理)

使用联合索引时必须从最左边的索引开始用起、不能直接跳过最左边的直接用后面的

key `idx_name_age_position`(`name`, `age`, `position`) using btree

使用索引时不能直接跳过name用age和position

为什么时最左列原则?

因为联合索引在B+树中是按照创建联合索引中列的顺序排好序的、如果跳过最左边的列直接用后面的列索引对于整个表来说并不是按照顺序从左到右依次递增的、所以无法达到索引的目的。

标签:存储,节点,叶子,索引,MysqlB,原理,数据,主键
From: https://blog.51cto.com/u_14318777/6029733

相关文章

  • ElasticSearch概念与架构原理
    一、概述ElasticSearch简介简介ES是建立在Lucene基础之上的分布式准实时搜索引擎,它所提供的诸多功能中有一大优点,就是实时性好。比如:在业务需求中,新增数据需要1min才......
  • 随堂笔记2-手写模拟spring底层原理
    userServce->无参构造方法->普通对象->依赖注入->初始化前(postStruct)->初始化(initializationBean)->初始化后(aop)->代理对象->bean大概流程:scan扫描注解,获取注......
  • 液压部件原理
    上图所示为一种液压传动系统的示意图利用液体压力传递的性质,根据液面平衡、压强相等原理,衡量得出质量的大小。液压原理在一定的机械、电子系统内,依靠液体介质的静压力,完成......
  • 【转载】【SSM】SpringBoot 统一功能处理,(*Spring 拦截器实现与原理)
    ✨1.用户登录权限效验1.1最初用户登录验证1.2SpringAOP用户统一登录验证的问题1.3Spring拦截器1. 自定义拦截器2.将自定义拦截器加入到系统配置1.4拦截器实......
  • AQS从应用到原理
    从高层来看AQS,即AbstractQueuedSynchronizer类,无论是听起来还是看起来,它都很令人畏惧,但抛离它的实现原理,站在AQS的用户——比如Mutex、CountDownLatch这些类——的视角来......
  • 计算机锁原理
    随着多进程多线程的出现,对共享资源(设备,数据等)的竞争往往会导致资源的使用表现为随机无序例如:一个线程想在控制台输出"Iamfine",刚写到"Iam",就被另一线程抢占控制台输......
  • OpenMP 线程同步 Construct 实现原理以及源码分析(下)
    OpenMP线程同步Construct实现原理以及源码分析(下)前言在上面文章当中我们主要分析了flush,critical,master这三个construct的实现原理。在本篇文章当中我们将主......
  • NAPT网络结构下TCP/UDP/ICMP访问外网原理思考
    背景作为程序员,应该都听说过NAT(NetworkAddressTransfer,网络地址转换)这一技术名词,并或多或少大概知道其原理与作用--NAT是用于解决IPv4地址不够用,保证我们能够在IPv6普......
  • 温度传感器实现原理与操作方法(经典版)
    第一:数字温度传感器(DS18B20)DS18B20是一款常用的高精度的单总线数字温度测量芯片。具有体积小,硬件开销低,抗干扰能力强,精度高的特点。温度传感器参数和特性:1、测温范围为-55℃......
  • 图解redis的5种数据类型底层原理
    redis的5种数据类型以及其底层实现redis是KV(key-valuepair)存储,不管是K还是V,底层都是对象(object组成)的,其中K是一个字符串对象(stringobject),V分别有我们常听说的5种......