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

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

      • 主要解答
      • 詳細解答
        • 1. **聚簇索引(Clustered Index)**
        • 2. **非聚簇索引(Non-Clustered Index / Secondary Index)**
        • 3. **對比總結**
        • 4. **流程圖(查詢過程對比)**
      • 知識拓展與延伸
        • 1. **如何選擇主鍵和索引**
        • 2. **Java 后端開發中的應用**
        • 3. **常見誤區**

主要解答

在 MySQL 的 InnoDB 引擎中,聚簇索引非聚簇索引的主要區別在于數據存儲方式和查詢機制:

  • 聚簇索引:主鍵索引,數據行與索引存儲在一起,數據按主鍵順序物理存儲。InnoDB 表必須有聚簇索引(通常為主鍵)。
  • 非聚簇索引:二級索引(Secondary Index),索引和數據分開存儲,索引葉子節點存儲主鍵值,查詢需通過主鍵“回表”獲取完整數據。

詳細解答

1. 聚簇索引(Clustered Index)
  • 特點
    • 數據與索引一體化:聚簇索引的 B+ 樹葉子節點存儲完整的數據行,數據按主鍵順序物理存儲。
    • 唯一性:一張 InnoDB 表只能有一個聚簇索引,通常是主鍵。如果沒有定義主鍵,InnoDB 會選擇第一個非空的唯一索引,或生成一個隱藏的 6 字節 ROWID 作為聚簇索引。
    • 存儲位置:數據和索引存儲在 .ibd 文件中。
  • 實現細節
    • B+ 樹結構:聚簇索引的 B+ 樹葉子節點包含完整行數據,非葉子節點存儲主鍵值和指針。
    • 插入/更新:插入或更新數據時,需維護 B+ 樹的平衡,可能觸發頁面分裂,影響性能。
    • 查詢效率:通過主鍵查詢直接定位數據行,無需額外 I/O。
    • 空間占用:由于數據與索引存儲在一起,聚簇索引本身不占用額外索引空間,但數據按主鍵順序存儲可能導致空間碎片。
  • 適用場景
    • 主鍵查詢(如 WHERE id = 100)。
    • 范圍查詢(如 WHERE id BETWEEN 100 AND 200)。
    • 排序操作(如 ORDER BY id)。
  • 優缺點
    • 優點
      • 主鍵查詢效率高,無需回表。
      • 范圍查詢和排序性能優越,因數據按順序存儲。
    • 缺點
      • 插入/更新成本較高,因需維護 B+ 樹平衡。
      • 非順序插入(如隨機 UUID 作為主鍵)可能導致頻繁頁面分裂。
  • 代碼示例
    -- 創建表時指定主鍵(聚簇索引)
    CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(50)
    ) ENGINE = InnoDB;
    -- 主鍵查詢(直接使用聚簇索引)
    SELECT * FROM users WHERE id = 100;
    
2. 非聚簇索引(Non-Clustered Index / Secondary Index)
  • 特點
    • 索引與數據分離:非聚簇索引的 B+ 樹葉子節點存儲索引列值和主鍵值(而非完整數據行)。
    • 回表操作:查詢時,先通過非聚簇索引找到主鍵值,再通過聚簇索引獲取完整數據(稱為“回表”)。
    • 多索引支持:一張表可以有多個非聚簇索引(如普通索引、唯一索引)。
  • 實現細節
    • B+ 樹結構:葉子節點存儲索引列值和對應的主鍵值,非葉子節點存儲索引列值和指針。
    • 存儲位置:索引存儲在 .ibd 文件的獨立 B+ 樹中,占用額外空間。
    • 查詢過程
      • 查找非聚簇索引,獲取主鍵值。
      • 通過主鍵值訪問聚簇索引,獲取完整數據。
    • 覆蓋索引:如果查詢字段全在非聚簇索引中(如 SELECT index_column FROM table),可避免回表。
  • 適用場景
    • 非主鍵字段的查詢(如 WHERE name = 'Alice')。
    • 覆蓋索引場景(如 SELECT user_id FROM users WHERE user_id = '100')。
    • 多條件查詢(如復合索引)。
  • 優缺點
    • 優點
      • 靈活支持多字段查詢。
      • 覆蓋索引可提高查詢效率。
    • 缺點
      • 回表操作增加 I/O 開銷。
      • 維護多個非聚簇索引增加插入/更新成本。
  • 代碼示例
    -- 創建非聚簇索引
    CREATE INDEX idx_name ON users(name);
    -- 非聚簇索引查詢(可能觸發回表)
    SELECT * FROM users WHERE name = 'Alice';
    -- 覆蓋索引查詢(無需回表)
    SELECT name FROM users WHERE name = 'Alice';
    
3. 對比總結
特性聚簇索引(Clustered Index)非聚簇索引(Non-Clustered Index)
存儲內容完整數據行索引列值 + 主鍵值
數量限制每表一個(通常為主鍵)可多個
查詢效率主鍵查詢無需回表,效率高需回表(除覆蓋索引外),效率較低
空間占用數據與索引一體,無額外索引空間占用額外索引空間
維護成本插入/更新需調整數據頁,成本較高維護多個索引,成本隨索引數增加
適用場景主鍵查詢、范圍查詢、排序非主鍵查詢、覆蓋索引、多條件查詢
4. 流程圖(查詢過程對比)

以下是用 Mermaid 流程圖語言描述的聚簇索引和非聚簇索引查詢過程:

聚簇索引
非聚簇索引
覆蓋索引
需回表
開始查詢
索引類型
查找主鍵 B+ 樹
直接獲取完整數據行
返回結果
查找二級索引 B+ 樹
獲取主鍵值
訪問聚簇索引
  • 聚簇索引:直接定位數據,步驟少。
  • 非聚簇索引:需先查索引再回表,步驟多,除非使用覆蓋索引。

知識拓展與延伸

1. 如何選擇主鍵和索引
  • 主鍵選擇(聚簇索引)
    • 優先選擇自增整數(如 INT AUTO_INCREMENT)作為主鍵,因其順序插入避免頁面分裂,查詢效率高。
    • 避免使用隨機值(如 UUID)作為主鍵,因隨機插入導致頻繁頁面分裂,增加維護成本。
    • 示例:
      CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,user_id VARCHAR(50)
      ) ENGINE = InnoDB;
      
  • 非聚簇索引設計
    • 為頻繁查詢的列(如 WHEREJOINORDER BY 條件)創建索引。
    • 使用復合索引優化多條件查詢,注意列順序(高選擇性列放前面)。
      CREATE INDEX idx_user_id_date ON orders(user_id, order_date);
      
    • 設計覆蓋索引減少回表:
      CREATE INDEX idx_user_id_name ON users(user_id, name);
      SELECT user_id, name FROM users WHERE user_id = '100'; -- 使用覆蓋索引
      
2. Java 后端開發中的應用
  • ORM 框架中的索引管理
    • 在 Spring Data JPA 中,使用 @Index 注解定義非聚簇索引:
      @Entity
      @Table(name = "users", indexes = {@Index(name = "idx_user_id", columnList = "user_id")})
      public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String userId;private String name;
      }
      
    • 通過 Hibernate 的 hbm2ddl 自動生成索引,或手動執行 DDL 語句。
  • 查詢優化
    • 使用 JPA 的 @Query 編寫高效 SQL,結合索引:
      @Query("SELECT u.userId, u.name FROM User u WHERE u.userId = :userId")
      List<Object[]> findUserByUserId(@Param("userId") String userId);
      
    • 分析慢查詢日志,優化未使用索引的查詢:
      SET GLOBAL slow_query_log = 1;
      
  • 批量操作
    • 批量插入時,禁用索引更新以提高性能:
      ALTER TABLE users DISABLE KEYS;
      INSERT INTO users (user_id, name) VALUES (...), (...);
      ALTER TABLE users ENABLE KEYS;
      
3. 常見誤區
  • 誤區 1:認為非聚簇索引總是效率低。覆蓋索引可避免回表,性能接近聚簇索引。
  • 誤區 2:忽略主鍵選擇對性能的影響。隨機主鍵(如 UUID)導致頁面分裂,降低插入性能。
  • 誤區 3:創建過多非聚簇索引。過多索引增加維護成本和磁盤占用,需定期清理冗余索引:
    SHOW INDEX FROM users;
    DROP INDEX idx_unused ON users;
    

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

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

相關文章

[2025CVPR]DE-GANs:一種高效的生成對抗網絡

目錄 引言:數據高效GAN的困境 核心原理:動態質量篩選機制 1. 判別器拒絕采樣(DRS)的再思考 2. 質量感知動態拒絕公式 (1)質量感知階段 (2)動態拒絕階段 模型架構:輕量化設計 技術突破:三大創新點 1. 首創訓練階段DRS 2. 動態拒絕機制 3. 質量重加權策略 …

[面試] 手寫題-數組轉樹

示例數據&#xff1a; const arr [{ id: 1, parentId: null, name: Root },{ id: 2, parentId: 1, name: Child 1 },{ id: 3, parentId: 1, name: Child 2 },{ id: 4, parentId: 2, name: Grandchild 1 }, ]目標生成&#xff1a; const tree [{id: 1,name: Root,children: …

CertiK《Hack3d:2025年第二季度及上半年Web3.0安全報告》(附報告全文鏈接)

CertiK《Hack3d&#xff1a;2025年第二季度及上半年Web3.0安全報告》現已發布&#xff0c;報告顯示&#xff1a;僅2025年上半年&#xff0c;因安全事件導致的損失接近25億美元&#xff1b;截至目前&#xff0c;總損失已超過去年全年水平。整體來看&#xff0c;Web3.0安全形勢依…

反向傳播 梯度消失

反向傳播 backpropagation 反向傳播&#xff08;Backpropagation&#xff09; 是神經網絡訓練中的一種核心算法&#xff0c;用于通過計算誤差并將其傳播回網絡&#xff0c;從而更新神經網絡的參數。通過反向傳播&#xff0c;網絡能夠在每次迭代中逐步調整其參數&#xff08;例…

京東外賣服務商加入方案對比!選擇本地生活服務商系統的優勢,到底在哪?

自入局之日起&#xff0c;京東外賣似乎就一直熱衷于給人驚喜&#xff1a; 先是在上線時規定了“2025年5月1日前入駐的商家&#xff0c;全年免傭金”和“僅限品質堂食商家入駐”&#xff1b; 再是宣布了要為外賣騎手繳納五險一金&#xff0c;并承擔其中的所有成本&#xff1b;…

【RTSP從零實踐】4、使用RTP協議封裝并傳輸AAC

&#x1f601;博客主頁&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客內容&#x1f911;&#xff1a;&#x1f36d;嵌入式開發、Linux、C語言、C、數據結構、音視頻&#x1f36d; &#x1f923;本文內容&#x1f923;&a…

Bootstrap 安裝使用教程

一、Bootstrap 簡介 Bootstrap 是一個開源的前端框架&#xff0c;由 Twitter 開發&#xff0c;旨在快速開發響應式、移動優先的 Web 頁面。它包含 HTML、CSS 和 JavaScript 組件&#xff0c;如按鈕、導航欄、表單等。 二、Bootstrap 安裝方式 2.1 使用 CDN&#xff08;推薦入…

Java學習第二部分——基礎語法

目錄 一.數據類型 &#xff08;一&#xff09;數值類型&#xff08;用于存儲數字&#xff0c;包括整數和浮點數&#xff09; 1. **整數類型** 2. **浮點類型** &#xff08;二&#xff09;非數值類型&#xff08;非數值類型用于存儲非數字數據&#xff09; 1. **char** 2…

Redis分布式鎖核心原理源碼

文章目錄 概述一、Redis實現分布式鎖1.1、第一版1.2、第二版1.3、第三版1.3、第四版 二、Redisson實現分布式鎖核心源碼分析2.1、加鎖核心源碼2.2、鎖續期核心源碼2.3、重試機制核心源碼2.4、解鎖核心源碼 總結 概述 傳統的單機鎖&#xff08;Synchronized&#xff0c;Reentran…

關于vue2使用elform的rules校驗

在使用vue2開發項目的時候使用element組件的el-form大多數情況都需要用到必填項校驗 舉個栗子&#xff1a; <el-form :model"ruleForm" :rules"rules" ref"ruleForm" label-width"100px" class"demo-ruleForm"><e…

langchain從入門到精通(二十六)——RAG優化策略(四)問題分解策略提升負責問題檢索準確率

1. LangChain 少量示例提示模板 在與 LLM 的對話中&#xff0c;提供少量的示例被稱為 少量示例&#xff0c;這是一種簡單但強大的指導生成的方式&#xff0c;在某些情況下可以顯著提高模型性能&#xff08;與之對應的是零樣本&#xff09;&#xff0c;少量示例可以降低 Prompt…

Nuxt.js基礎(Tailwind基礎)

??1. 按鈕組件實現?? ??傳統 CSS <!-- HTML --> <button class"btn-primary">提交</button><!-- CSS --> <style>.btn-primary {background-color: #3490dc;padding: 0.5rem 1rem;border-radius: 0.25rem;color: white;transi…

[C語言]存儲結構詳解

C語言存儲結構總結 在C語言中&#xff0c;數據根據其類型和聲明方式被存儲在不同的內存區域。以下是各類數據存儲位置的詳細總結&#xff1a; 內存五大分區 存儲區存儲內容生命周期特點代碼區(.text)程序代碼(機器指令)整個程序運行期只讀常量區(.rodata)字符串常量、const全…

【實戰】 容器中Spring boot項目 Graphics2D 畫圖中文亂碼解決方案

場景 架構&#xff1a;spring boot 容器技術&#xff1a;docker 服務器&#xff1a;阿里云 開發環境&#xff1a;windows10 IDEA 一、問題 服務器中出現Graphics2D 畫圖中文亂碼 本地環境運行正常 二、原因 spring boot 容器中沒有安裝中文字體 三、解決方案 安裝字體即可 …

深入淺出:Vue2 數據劫持原理剖析

目錄 一、什么是數據劫持&#xff1f; 二、核心 API&#xff1a;Object.defineProperty 三、Vue2 中的數據劫持實現 1. 對象屬性的劫持 2. 嵌套對象的處理 3. 數組的特殊處理 四、結合依賴收集的完整流程 五、數據劫持的局限性 六、Vue3 的改進方案 總結 一、什么是數…

數據湖 vs 數據倉庫:數據界的“自來水廠”與“瓶裝水廠”?

數據湖 vs 數據倉庫&#xff1a;數據界的“自來水廠”與“瓶裝水廠”&#xff1f; 說起“數據湖”和“數據倉庫”&#xff0c;很多剛入行的朋友都會覺得&#xff1a; “聽起來好高大上啊&#xff01;但到底有啥區別啊&#xff1f;是湖更大還是倉庫更高端&#xff1f;” 我得說…

Node.js-path模塊

Path 模塊 path 模塊提供了 操作路徑 的功能&#xff0c;我們將介紹如下幾個較為常用的幾個 API ??path.resolve([…paths]) 將路徑片段??解析為絕對路徑??&#xff08;從右向左拼接&#xff0c;遇到絕對路徑停止&#xff09; // 若參數為空&#xff0c;返回當前工作目…

Java面試題029:一文深入了解MySQL(1)

歡迎大家關注我的專欄,該專欄會持續更新,從原理角度覆蓋Java知識體系的方方面面。 一文吃透JAVA知識體系(面試題)https://blog.csdn.net/wuxinyan123/category_7521898.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=7521898&

vue3.0所采用得Composition Api與Vue2.XOtions Api有什么不同?

Vue 3.0 引入的 Composition API 相較于 Vue 2.x 的 Options API 有顯著的不同。下面從幾個方面對比這兩者的差異&#xff1a; ? 1. 代碼組織方式不同 Vue 2.x — Options API 使用 data、methods、computed、watch 等分散的選項組織邏輯。 每個功能點分散在不同的選項中&am…

【IP 潮玩行業深度研究與學習】

潮玩行業發展趨勢分析&#xff1a;全球市場格局與中國政策支持體系 潮玩產業正經歷從"小眾收藏"到"大眾情緒消費"的深刻轉型&#xff0c;2025年中國潮玩市場規模已達727億元&#xff0c;預計2026年將突破1100億元&#xff0c;年復合增長率高達26%。這一千…