<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Mysql on Coder_Studio</title>
        <link>https://iamxurulin.github.io/tags/mysql/</link>
        <description>Recent content in Mysql on Coder_Studio</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en-us</language>
        <copyright>iamxurulin</copyright>
        <lastBuildDate>Sun, 05 Apr 2026 17:35:33 +0000</lastBuildDate><atom:link href="https://iamxurulin.github.io/tags/mysql/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>MySQL的三层B&#43;树能存多少数据？</title>
        <link>https://iamxurulin.github.io/p/mysql%E7%9A%84%E4%B8%89%E5%B1%82b-%E6%A0%91%E8%83%BD%E5%AD%98%E5%A4%9A%E5%B0%91%E6%95%B0%E6%8D%AE/</link>
        <pubDate>Mon, 16 Mar 2026 13:09:19 +0000</pubDate>
        
        <guid>https://iamxurulin.github.io/p/mysql%E7%9A%84%E4%B8%89%E5%B1%82b-%E6%A0%91%E8%83%BD%E5%AD%98%E5%A4%9A%E5%B0%91%E6%95%B0%E6%8D%AE/</guid>
        <description>&lt;p&gt;InnoDB读写磁盘的最小单位是&lt;strong&gt;页（Page）&lt;/strong&gt;，默认大小&lt;strong&gt;16KB&lt;/strong&gt;。&lt;br&gt;
而MySQL的主键索引B+树，每一个树节点（不管是根节点、中间节点、叶子节点），&lt;strong&gt;本质上就是一个16KB的页&lt;/strong&gt;。&lt;br&gt;
所有计算，都是围绕【1个16KB的页，能存多少东西】展开的。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;节点类型&lt;/th&gt;
          &lt;th&gt;存的内容&lt;/th&gt;
          &lt;th&gt;特点&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;非叶子节点（根节点、中间层节点）&lt;/td&gt;
          &lt;td&gt;只存主键值 + 指向下一层页的指针&lt;/td&gt;
          &lt;td&gt;不存完整用户数据，体积极小，一个页能存上千个&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;叶子节点（最底层节点）&lt;/td&gt;
          &lt;td&gt;存用户的完整一行行数据&lt;/td&gt;
          &lt;td&gt;存真实业务数据，体积大，一个页能存的行数有限&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;1先算1个非叶子节点能存多少个索引项&#34;&gt;1.先算1个非叶子节点，能存多少个索引项
&lt;/h3&gt;&lt;p&gt;非叶子节点存的是「主键值 + 指针」，我们先算单个索引项的大小：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;主键大小&lt;/strong&gt;：假设主键是&lt;code&gt;bigint&lt;/code&gt;类型，MySQL里&lt;code&gt;bigint&lt;/code&gt;固定占&lt;strong&gt;8字节&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;指针大小&lt;/strong&gt;：InnoDB里指向页的指针，固定占&lt;strong&gt;6字节&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;单个索引项总大小&lt;/strong&gt;：8字节（主键） + 6字节（指针） = &lt;strong&gt;14字节&lt;/strong&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;一个页是16KB，换算成字节是 &lt;code&gt;16 × 1024 = 16384字节&lt;/code&gt;。&lt;br&gt;
所以一个非叶子页能存的索引项数量：&lt;br&gt;
&lt;code&gt;16384 ÷ 14 ≈ 1170个&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&#34;2再算1个叶子节点能存多少行数据&#34;&gt;2.再算1个叶子节点，能存多少行数据
&lt;/h3&gt;&lt;p&gt;叶子节点存的是用户的完整一行行数据，&lt;strong&gt;假设&lt;/strong&gt;一行业务数据占1KB（比如一张表有id、name、age、create_time等字段，加起来差不多1KB）。&lt;/p&gt;
&lt;p&gt;一个页是16KB，所以一个叶子页能存的行数：&lt;br&gt;
&lt;code&gt;16KB ÷ 1KB/行 = 16行&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&#34;3最后算三层b树的总数据量&#34;&gt;3.最后算三层B+树的总数据量
&lt;/h3&gt;&lt;p&gt;顺着三层结构，从根节点往下算：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;第一层（根节点）&lt;/strong&gt;：1个非叶子页，能存1170个索引项 → 能指向1170个第二层的页；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第二层（中间非叶子节点）&lt;/strong&gt;：1170个非叶子页，每个页又能存1170个索引项 → 能指向 &lt;code&gt;1170 × 1170 = 1368900&lt;/code&gt; 个第三层的叶子页；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第三层（叶子节点）&lt;/strong&gt;：每个叶子页能存16行数据。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;最终总数据量 = 叶子页总数 × 每个叶子页的行数：&lt;br&gt;
&lt;code&gt;1170 × 1170 × 16 ≈ 2190万条&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;所以，三层B+树大约能存2000万条记录。&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
