首页 > 数据库 >索引是不是建的越多越好?MySQL索引用的什么数据结构?一棵B+树能存储多少条数据?

索引是不是建的越多越好?MySQL索引用的什么数据结构?一棵B+树能存储多少条数据?

时间:2023-10-14 13:06:27浏览次数:34  
标签:存储 树能 叶子 索引 MySQL 磁盘 节点 指针

一、索引是不是建的越多越好

当然不是。

索引会占据磁盘空间

索引虽然会提高查询效率,但是会降低更新表的效率。比如每次对表进行增删改操作,MySQL不仅要保存数据,还有保存或者更新对应的索引文件。

二、MySQL索引用的什么数据结构

MySQL的默认存储引擎是InnoDB,它采用的是B+树结构的索引。

B+树:只有叶子节点才会存储数据,非叶子节点只存储键值。叶子节点之间使用双向指针连接,最底层的叶子节点形成了一个双向有序链表。

索引是不是建的越多越好?MySQL索引用的什么数据结构?一棵B+树能存储多少条数据?_子节点

在这张图里,有两个重点:

最外面的方块,的块我们称之为一个磁盘块,可以看到每个磁盘块包含几个数据项(粉色所示)和指针(黄色/灰色所示),如根节点磁盘包含数据项17和35,包含指针P1、P2、P3,P1表示小于17的磁盘块,P2表示在17和35之间的磁盘块,P3表示大于35的磁盘块。真实的数据存在于叶子节点即3、4、5……、65。非叶子节点只不存储真实的数据,只存储指引搜索方向的数据项,如17、35并不真实存在于数据表中。

叶子节点之间使用双向指针连接,最底层的叶子节点形成了一个双向有序链表,可以进行范围查询。

三、一棵B+树能存储多少条数据

索引是不是建的越多越好?MySQL索引用的什么数据结构?一棵B+树能存储多少条数据?_数据_02

假设索引字段是 bigint 类型,长度为 8 字节。指针大小在 InnoDB 源码中设置为 6字节,这样一共 14 字节。非叶子节点(一页)可以存储 16384/14=1170 个这样的 单元(键值+指针),代表有 1170 个指针。

树深度为 2 的时候,有 1170^2 个叶子节点,可以存储的数据为1170*1170*16=21902400。

在查找数据时一次页的查找代表一次 IO,也就是说,一张 2000 万左右的表,查询数据最多需要访问 3 次磁盘。所以在 InnoDB 中 B+ 树深度一般为 1-3 层,它就能满足千万级的数据存储。

标签:存储,树能,叶子,索引,MySQL,磁盘,节点,指针
From: https://blog.51cto.com/u_16255459/7859596

相关文章

  • LINUX:sqoop连接:ERROR manager.CatalogQueryManager: Failed to list databases com.my
    可见是连接的jar包出现了错误  通过命令发现我的是5.7版本,将驱动jar包替换为5.几的  之后通过命令成功解决......
  • MySQL学习(5)记录存在那里——表空间
    前言存储引擎都是把数据存储在文件系统上,通过通过查询命令,可以查看数据目录所在的本机路径。mysql>SHOWVARIABLESLIKE'datadir';+---------------+-----------------+|Variable_name|Value|+---------------+-----------------+|datadir|/var/l......
  • 将excel文件导入到Navicat的mysql中步骤详解
    将转换好的csv文件导入到Navicat中1、右键数据库中表的名称,选中导入向导:2、之后选择导入的文件结构:我们在这里选中excel类型;点击下一步;3、浏览到excel文件的路径然后选中该表:点击下一步;4、自定义一些附加选项点击下一步;5、选中这个新建表然后点击下一步;6、修改表......
  • elasticsearch通过Java class类的@Setting和@Mapping来定义索引index
    今天就来和大家讲讲如何将es索引中的mapping和setting在索引index和class联系起来,其实在这个问题也困扰我好久了,一直没有解决,在elasticsearch7.x版本的时候貌似好像可以用request在程序中来建立索引,像Stringindex=“{“mapping”:...}”之类的操作,干起来比较复杂,在elasticsear......
  • MySQL删除表的命令是什么
    MySQL删除表命令:删除表命令是DROPTABLE,其基本语法如下:删除单个表DROPTABLEtable_name;注:这个命令会直接删除指定表,如果这个表不存在就会报错。另外,删除表之前最好做好备份。同时删除多个表DROPTABLEtable_name1,table_name2,...;注:这个命令可以同时删除多张......
  • 文件默认打开方式 + mysql导入错误 + 输入法问题
    文件默认打开方式默认应用修改:设置—》应用—》默认应用—》按文件类型指定默认应用mysql导入错误Unknowncollation:'utf8mb4_0900_ai_ci'Mysql导入sql文件时,出Unknowncollation:'utf8mb4_0900_ai_ci'错误。原因:sql文件是从高版本mysql(8.0)中导出的,导入到......
  • mysql数据库性能优化
    数据库的性能优化可以从以下几个方面进行优化:1.硬件和操作系统:硬件可以从cpu、内存、I/O,网络带宽等方面进行优化。系统层可以从文件句柄数,网络配置等方面2.数据库的架构:比如主从集群以及主从架构的变种可以做高可用及容灾,读写分离可以避免读操作比较高的服务影响数据写入,分库分表......
  • 深入理解MySQL中的Join算法
    本文已收录至GitHub,推荐阅读......
  • mysql 分区表
    场景:数据库磁盘爆满,使用delete无法清理磁盘,清理会有binlog,redolog,磁盘无法释放。个人遇到的真实场景:数据库数据上千万,要清理历史数据,但是delete删除数据无法释放磁盘,运维老大哥给的方案,先分区表,然后再truncate这样就能清理历史数据,磁盘也能释放。 操作步骤:1,查看数据库......
  • mysql 自带的数据库下载地址
    https://dev.mysql.com/doc/index-other.html  ......