1-002:MySQL InnoDB引擎中的聚簇索引和非聚簇索引有什么區別?

MySQL InnoDB 存儲引擎 中,索引主要分為 聚簇索引(Clustered Index)非聚簇索引(Secondary Index)。它們的主要區別如下:


1. 聚簇索引(Clustered Index)

定義

  • 聚簇索引是表數據存儲的方式,即 索引和數據在一起葉子節點存儲的是完整的行記錄
  • InnoDB 中的主鍵索引就是聚簇索引(如果沒有主鍵,InnoDB 會選擇一個 UNIQUE 索引作為聚簇索引;如果沒有 UNIQUE,InnoDB 會自動生成一個隱藏的 rowid)。

存儲結構

  • 使用 B+ 樹 結構存儲,葉子節點存放 完整的行數據
  • 數據物理存儲順序和主鍵索引順序一致。

特點

  • 訪問主鍵索引時,直接獲取整行數據,查詢速度快。
  • 數據存儲在主鍵索引的葉子節點上表本身就是一棵 B+ 樹
  • 適用于 基于主鍵的查詢、范圍查詢
  • 更新、刪除、插入操作可能導致數據的頁分裂,影響性能。

示例

CREATE TABLE users (id INT PRIMARY KEY,  -- 主鍵,自動成為聚簇索引name VARCHAR(50),age INT
);

users 表中,id 作為 聚簇索引,數據在磁盤上的存儲順序與 id 值的順序相同。


2. 非聚簇索引(Secondary Index / 輔助索引)

定義

  • 非聚簇索引是獨立于數據存儲的索引葉子節點存儲的是主鍵值,而不是完整的行數據。
  • 訪問非聚簇索引時,需要先查找索引,再通過主鍵回表查詢數據,這種過程稱為 回表查詢(回溯查詢,Bookmark Lookup)

存儲結構

  • 也是 B+ 樹 結構,但葉子節點存儲的是主鍵值,而非完整的行記錄。

特點

  • 加速非主鍵列的查詢(適用于 WHERE 條件非主鍵字段)。
  • 需要二次查詢(先通過非聚簇索引找到主鍵值,再回表查詢完整數據)。
  • 索引占用空間較大,需要額外存儲主鍵值。

示例

CREATE TABLE users (id INT PRIMARY KEY,  -- 主鍵(聚簇索引)name VARCHAR(50),age INT,INDEX idx_name (name)  -- 非聚簇索引
);

如果執行:

SELECT * FROM users WHERE name = 'Alice';

查詢過程如下:

  1. 先在 非聚簇索引 idx_name 中查找 Alice,獲取其 主鍵 id
  2. 使用 id聚簇索引 中回表查找完整的行數據。

3. 聚簇索引 vs. 非聚簇索引

對比項聚簇索引(Clustered Index)非聚簇索引(Secondary Index)
存儲結構葉子節點存儲 完整行數據葉子節點存儲 主鍵值
查詢速度主鍵查詢快(無需回表)非主鍵查詢慢(需要回表)
插入速度(影響數據存儲順序)較快(不影響主鍵順序)
更新操作影響數據物理存儲順序,可能導致頁分裂更新可能導致回表查詢增加
占用空間只存儲數據本身需要存儲 索引列 + 主鍵值,占用空間大
適用場景主鍵查詢,范圍查詢查詢非主鍵列,提高查詢性能

4. 什么時候使用聚簇索引 vs. 非聚簇索引?

? 適合使用聚簇索引的場景

  • 主鍵查詢多,如 WHERE id = 100;
  • 范圍查詢多,如 BETWEEN 100 AND 200;
  • 數據表的主鍵是有序遞增的(如 AUTO_INCREMENT),避免頁分裂。

? 適合使用非聚簇索引的場景

  • 查詢非主鍵字段時,如 WHERE name = 'Alice';
  • 涉及聯合查詢,如 INDEX (name, age);
  • 表很大,不希望頻繁回表查詢(可以使用 覆蓋索引,避免回表)。

5. 可能的優化方案

  1. 覆蓋索引(Covering Index)

    • 避免回表,提高查詢性能

    • 優化方法:如果查詢的數據只包含索引字段,則直接從索引中獲取數據,不需要回表。

    • 示例:

      CREATE INDEX idx_name_age ON users(name, age);
      SELECT name, age FROM users WHERE name = 'Alice';  -- 只查 name 和 age,不回表
      
  2. 使用合適的主鍵

    • 采用 自增主鍵,避免頁分裂,提高插入性能。
    • 避免使用 UUID、隨機值作為主鍵,會導致索引失效、性能下降。
  3. 減少回表查詢

    • 索引覆蓋查詢,如 SELECT name FROM users WHERE name = 'Alice';
    • 適當調整索引列,如 INDEX (name, age) 避免多次回表。

總結

  • InnoDB 中的主鍵索引是聚簇索引,數據存儲在 B+ 樹的葉子節點上,查詢主鍵時速度最快
  • 非聚簇索引存儲的是主鍵值,查詢時需要回表查詢完整數據,適用于非主鍵查詢場景。
  • 優化索引可以減少回表查詢,提高 MySQL 查詢性能

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/72995.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/72995.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/72995.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【解決哈希沖突】

哈希沖突 如果兩個不同的 key 通過哈希函數得到了相同的索引,這種情況就叫做「哈希沖突」。 哈希沖突不可能避免,只能在算法層面妥善處理出現哈希沖突的情況。 哈希沖突是一定會出現的,因為這個 hash 函數相當于是把一個無窮大的空間映射到…

文件操作詳解(萬字長文)

C語言文件操作 一、為什么使用文件?二、文件分類三、文件的打開和關閉四、文件的順序讀寫4.1fputc4.2fgetc4.3fputs4.4fgets4.5 fprintf4.6 fscanf4.7 fwrite4.8 fread 五、文件的隨機讀寫5.1 fseek5.2 ftell和rewind六、文件讀取結束的判定七、文件緩沖區 一、為什…

基于 JDBC 的后端與 MySQL 數據庫交互 javaweb

一、了解JDBC 二、添加MySQL的JDBC驅動包 三、使用JDBC連接數據庫應用🔗 3.1創建一個包 3.2 查找實例 3.3 修改添加刪除實例 四、封裝 📦 DBConnection.java MysqlUtil.java 測試使用一下 測試1 測試2 在后端開發中,與數據庫進行交…

貪心算法--

1.檸檬水找零 link:860. 檸檬水找零 - 力扣&#xff08;LeetCode&#xff09; code class Solution { public:bool lemonadeChange(vector<int>& bills) {// 貪心算法&#xff0c; 優先花出大面額bill&#xff0c; 盡可能保護小面額billint five 0, ten 0;// 不…

基于YOLO11深度學習的電瓶車進電梯檢測與語音提示系統【python源碼+Pyqt5界面+數據集+訓練代碼】

《------往期經典推薦------》 一、AI應用軟件開發實戰專欄【鏈接】 項目名稱項目名稱1.【人臉識別與管理系統開發】2.【車牌識別與自動收費管理系統開發】3.【手勢識別系統開發】4.【人臉面部活體檢測系統開發】5.【圖片風格快速遷移軟件開發】6.【人臉表表情識別系統】7.【…

github生成badges的方法

在Github頁面上生成類似下面這樣的badge的方法 你可以通過以下步驟在GitHub個人主頁的README中創建類似的技術棧徽章&#xff1a; 一、使用 Shields.io 生成徽章 Shields.io 是一個開源徽章生成工具&#xff0c;支持自定義文本、顏色、圖標等參數。 1. 基礎模板 https://…

vue3 二次封裝uni-ui中的組件,并且組件中有 v-model 的解決方法

在使用uniappvue3開發中&#xff0c; 使用了uni-ui的組件&#xff0c;但是我們也需要自定義組件&#xff0c;比如我要自定一個picker 的組件&#xff0c; 是在 uni-data-picker 組件的基礎上進行封裝的 父組件中的代碼 <classesselect :selectclass"selectclass"…

Spring Boot啟動流程及源碼實現深度解析

Spring Boot啟動流程及源碼實現深度解析 一、啟動流程概述 Spring Boot的啟動流程圍繞SpringApplication類展開&#xff0c;核心流程可分為以下幾個階段&#xff1a; 初始化階段&#xff1a;推斷應用類型&#xff0c;加載ApplicationContextInitializer和ApplicationListene…

爬蟲案例七Python協程爬取視頻

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、Python協程爬取視頻 前言 提示&#xff1a;這里可以添加本文要記錄的大概內容&#xff1a; 爬蟲案例七協程爬取視頻 提示&#xff1a;以下是本篇文章正文…

uni-app開發的App和H5嵌套封裝的App,以及原生App有什么區別

uni-app 開發的 App 和 H5 嵌套封裝的 App 是兩種不同的開發模式&#xff0c;雖然它們都可以實現跨平臺開發&#xff0c;但在技術實現、性能、功能支持等方面有顯著區別。以下是詳細對比&#xff1a; 1. uni-app 開發的 App uni-app 是一個基于 Vue.js 的跨平臺開發框架&#…

Python 爬蟲實戰案例 - 獲取拉勾網招聘職位信息

引言 拉勾網&#xff0c;作為互聯網招聘領域的佼佼者&#xff0c;匯聚了海量且多樣的職位招聘信息。這些信息涵蓋了從新興科技領域到傳統行業轉型所需的各類崗位&#xff0c;無論是初出茅廬的應屆生&#xff0c;還是經驗豐富的職場老手&#xff0c;都能在其中探尋到機遇。 對…

LM Studio 替換源的方式解決huggingface.co無法訪問的問題

安裝軟件完成之后&#xff0c;不要打開&#xff0c;打開了就直接關閉 在安裝目錄下&#xff0c;比如我安裝在E:\Program Files\LM Studio 下面三個文件中的huggingface.co全部替換為hf-mirror.com然后再打開即可。 E:\Program Files\LM Studio\resources\app\.webpack\rende…

【模擬CMOS集成電路設計】帶隙基準(Bandgap)設計與仿真(基于運放的電流模BGR)

【模擬CMOS集成電路設計】帶隙基準&#xff08;Bandgap&#xff09;設計與仿真 前言工程文件&部分參數計算過程&#xff0c;私聊~ 一、 設計指標指標分析&#xff1a; 二、 電路分析三、 仿真3.1仿真電路圖3.2仿真結果(1)運放增益(2)基準溫度系數仿真(3)瞬態啟動仿真(4)靜態…

微服務拆分-遠程調用

我們在查詢購物車列表的時候&#xff0c;它有一個需求&#xff0c;就是不僅僅要查出購物車當中的這些商品信息&#xff0c;同時還要去查到購物車當中這些商品的最新的價格和狀態信息&#xff0c;跟購物車當中的快照進行一個對比&#xff0c;從而去提醒用戶。 現在我們已經做了服…

機動車授權簽字人考試的報名條件是什么?

機動車授權簽字人考試的報名條件通常如下&#xff1a; 學歷職稱與工作經驗要求 中級職稱及以上&#xff1a;應具備中級及以上專業技術職稱&#xff0c;且從事相關檢驗檢測工作三年及以上。如果承檢車型有專項作業車、大型客車、校車和危險貨物運輸車等&#xff0c;若不是相關專…

智慧工廠監測信息系統:構筑安全的數字化未來

在現代工業的浪潮中&#xff0c;智慧工廠已成為推動生產效率和產品質量提升的關鍵力量。為了確保這一先進生產模式的穩健運行&#xff0c;智慧工廠監測信息系統應運而生&#xff0c;并通過一系列安全措施&#xff0c;為企業的數字化轉型保駕護航。 安全注冊&#xff0c;筑牢第…

P2P中NAT穿越方案(UDP/TCP)(轉)

轉自&#xff1a;P2P中NAT穿越方案&#xff08;UDP/TCP&#xff09;_udp反向鏈接-CSDN博客 同&#xff1a;P2P中NAT穿越方案&#xff08;UDP/TCP&#xff09; - 知乎 (zhihu.com) 本文介紹了傳統基于udp的打洞方式&#xff0c;更進一步闡述了tcp打洞的原理&#xff0c;是對于…

算法 之 樹形dp 樹的中心、重心

文章目錄 重心實踐題目小紅的陡峭值 在樹的算法中&#xff0c;求解樹的中心和重心是一類十分重要的算法 求解樹的重心 樹的重心的定義&#xff1a;重心是樹中的一個節點&#xff0c;如果將這個點刪除后&#xff0c;剩余各個連通塊中點數的最大值最小&#xff0c;那么這個節點…

游戲引擎學習第146天

音高變化使得對齊讀取變得不可能&#xff0c;我們可以支持循環聲音了。 我們今天的目標是完成之前一段時間所做的音頻代碼。這個項目并不依賴任何引擎或庫&#xff0c;而是一個教育項目&#xff0c;目的是展示從頭到尾運行一個游戲所需要的全部代碼。無論你對什么方面感興趣&a…

深入理解MySQL主從原理

導讀 高鵬&#xff08;網名八怪&#xff09;&#xff0c;《深入理解MySQL主從原理》系列文的作者。 本系列通過GTID、Event、主庫、從庫、案例分析&#xff0c;五大塊來詳細講解主從原理。 這篇文章重在學習筆記整理&#xff01; 在學習《深入理解MySQL主從原理》一書時&…