聚集索引与非聚集索引的区别
<p>聚集索引(Clustered Index)和非聚集索引(Non-Clustered Index)是索引设计的核心概念,二者的本质区别体现在 <strong>与数据物理存储的关联方式 </strong>上,这种区别直接决定了它们的性能特性和适用场景。</p><p>我们平时说的 <strong>聚簇索引</strong> 和 <strong>非聚簇索引</strong>,其实就是 <strong>聚集索引</strong> 与 <strong>非聚集索引</strong>,同一个东西,只是叫法不一样。现在在比较新的文献、资料中,习惯叫聚集索引和非聚集索引。</p>
<h3>聚集索引:索引即数据的 "物理排列"</h3>
<p>1、聚集索引的核心是 <strong>索引键的排序顺序与数据在磁盘上的物理存储顺序完全一致</strong>。</p>
<p>2、可以类比为 <strong>按ISBN号来排序的图书馆书架</strong>(ISBN,International Standard Book Number,国际标准书号),书在书架上的物理顺序就是ISBN顺序<strong>(数据物理顺序=索引顺序)</strong>,找书时直接按号码走到对应书架即可。</p>
<p>3、在数据库中,聚集索引的<strong> 叶子节点直接存储完整的行数据</strong>(而非指针)。也就是说,通过聚集索引找到叶子节点时,就能直接获取该行的所有字段值,<strong>无需额外查找</strong>。</p>
<p>4、由于数据的物理存储顺序只有一种,<strong>一张表只能有一个聚集索引</strong>(这是最关键的限制),一般来说是 <strong>表的主键</strong>。</p>
<p>5、聚集索引的 <strong>B+树</strong> 示图:</p>
<p><img src="https://img2024.cnblogs.com/blog/1171560/202508/1171560-20250805211726201-246768642.png" alt="1"></p>
<h3>非聚集索引:索引与数据 "独立排序"</h3>
<p>1、非聚集索引的索引键排序与数据的物理存储顺序 <strong>毫无关联</strong>,二者是相互独立的结构。</p>
<p>2、可以类比为 <strong>图书馆入口处的电脑搜索</strong>,可以按 <strong>作者/书名/主题</strong> 等多种方式搜索。在电脑处搜索,每次搜索实际指向 <strong>书在书架的实际位置(包含指针)</strong>,我们需要先在电脑处搜索,再根据搜索出的位置信息去书架找书<strong>(二次查找)</strong>。</p>
<p>3、在数据库中,非聚集索引的 <strong>叶子节点存储的是 "索引键值" 和 "指向数据物理位置的指针"</strong>。通过非聚集索引查询时,需要先找到叶子节点的指针,再根据指针去磁盘读取完整数据(这个过程又称为 <strong>"书签查找"</strong>,也就是我们经常说的 <strong>"回表"</strong>)。</p>
<p>4、由于不影响数据的物理存储,<strong>一张表可以创建多个非聚集索引</strong>(但数量过多会增加存储和维护成本)。</p>
<p>5、非聚集索引的 <strong>B+树 </strong>示图:</p>
<p><img src="https://img2024.cnblogs.com/blog/1171560/202508/1171560-20250805211744761-1453501536.png" alt="2"></p>
<h3>对比</h3>
<table>
<thead>
<tr>
<th><strong>对比维度</strong></th>
<th><strong>聚集索引</strong></th>
<th><strong>非聚集索引</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>与数据存储的关系</td>
<td>决定数据的物理存储顺序(索引 = 数据顺序)</td>
<td>与数据物理存储顺序无关(索引独立排序)</td>
</tr>
<tr>
<td>数量限制</td>
<td>1 个(表的物理顺序唯一)</td>
<td>多个(通常建议不超过 5-6 个,避免性能损耗)</td>
</tr>
<tr>
<td>叶子节点内容</td>
<td>完整的行数据(包含所有字段)</td>
<td>索引键值 + 指针(指向数据位置或聚集索引键)</td>
</tr>
<tr>
<td>查询性能(全量数据)</td>
<td>极高(直接定位数据,无二次查找)</td>
<td>相对聚集低一些(需先查索引,再通过指针找数据)</td>
</tr>
<tr>
<td>范围查询效率</td>
<td>最优(数据连续存储,可批量读取)</td>
<td>相对聚集差一些(需多次书签查找,数据分散)</td>
</tr>
<tr>
<td>对写入的影响</td>
<td>插入 / 更新成本高(可能导致数据物理移动)</td>
<td>插入 / 更新成本较低(仅需维护索引结构)</td>
</tr>
</tbody>
</table>
<h3>总结</h3>
<ul>
<li><strong>聚集索引是 "数据的物理排列方式"</strong>,索引与数据绑定,全表只能有一个,磁盘IO效率 - <strong>"连续IO"</strong>。</li>
<li><strong>非聚集索引是 "数据的目录"</strong>,索引与数据独立,全表可以有多个,磁盘IO效率 - <strong>"随机IO"</strong>。</li>
</ul>
<p style="text-align: right"><span style="color: rgba(53, 152, 219, 1)">别让过分苛求,阻碍了我们通往优秀的路,更不要因为追求完美,给自己施加太大压力,而不去行动。-- 烟沙九洲</span></p><br><br>
来源:https://www.cnblogs.com/yanshajiuzhou/p/19024063
頁:
[1]