MySQL中InnoDB索引使用與底層原理

MySQL Server端的緩存(查詢緩存)是MySQL Server層的特性,而InnoDB的緩存(緩沖池)是InnoDB存儲引擎層的特性。兩者是完全獨立的。

下面我們來深入探討這兩者以及InnoDB索引的原理。


1. MySQL Server層的緩存 - 查詢緩存 (Query Cache)

  • 歸屬MySQL Server特性。它是一個全局性的組件,理論上對所有存儲引擎(如InnoDB, MyISAM)的查詢都可能生效。

  • 工作原理

    1. 當執行一個SELECT語句時,MySQL會先計算這個語句的哈希值,然后去查詢緩存中查找是否有完全匹配(字節對字節完全相同)的查詢結果。

    2. 如果找到(緩存命中),則直接返回結果,完全跳過解析、優化和執行階段,效率極高。

    3. 如果未找到(緩存未命中),則繼續執行查詢,獲取結果后,會將結果存儲到查詢緩存中,以備下次使用。

  • 失效機制非常粗粒度。只要對某張表進行了任何寫操作(INSERT, UPDATE, DELETE, TRUNCATE, ALTER TABLE等),那么所有與這張表相關的查詢緩存都會全部失效并被清除。這對于寫操作頻繁的數據庫來說,緩存命中率會非常低,維護緩存反而帶來了巨大的性能開銷。

  • 現狀在MySQL 5.7中開始棄用,在MySQL 8.0中已被徹底移除。主要原因就是其弊大于利,在高并發讀寫場景下,緩存失效帶來的爭用甚至會導致性能下降。現在通常建議使用應用層緩存(如Redis, Memcached)來替代它。


2. InnoDB存儲引擎的緩存 - 緩沖池 (Buffer Pool)

  • 歸屬InnoDB存儲引擎的特性。這是InnoDB自身實現的核心組件。

  • 工作原理

    1. 緩沖池是主內存中的一片區域,用于緩存表和索引數據。當需要讀取數據時,InnoDB會先檢查數據頁是否在緩沖池中。如果在(緩存命中),則直接讀取內存,速度極快。

    2. 如果不在(緩存未命中),則從磁盤讀取相應的數據頁,并將其放入緩沖池中,然后再進行讀取。

    3. 對于寫操作,修改的也是緩沖池中的數據頁。這些被修改但尚未刷新到磁盤的頁稱為臟頁 (Dirty Page)。InnoDB有后臺線程定期將臟頁刷新到磁盤,這個過程稱為刷臟 (Checkpointing)

  • 重要性這是InnoDB性能的核心。通過緩沖池,InnoDB將磁盤I/O操作最小化,將最多的操作在內存中完成。緩沖池的大小(通過?innodb_buffer_pool_size?參數設置)是MySQL性能調優最重要的參數,通常建議設置為服務器物理內存的50%-80%。

  • 與索引的關系:B+樹索引的非葉子節點和頻繁訪問的葉子節點都會常駐在緩沖池中,這使得基于索引的查詢速度非常快。


3. InnoDB索引使用與底層原理

索引數據結構:B+樹

InnoDB使用B+樹作為其索引的數據結構。B+樹是為磁盤存儲而優化的,它具有以下特點:

  • 矮胖樹:層級很少,通常只需2-4次I/O就能在億萬級數據中找到目標。

  • 所有數據都存儲在葉子節點:非葉子節點只存儲鍵值(索引列的值)和指向子節點的指針,這使得非葉子節點可以存儲大量鍵值,讓樹更“矮胖”。

  • 葉子節點形成有序鏈表:范圍查詢效率極高,只需找到范圍的起始點,然后沿著鏈表遍歷即可。

聚集索引 (Clustered Index)
  • InnoDB的表必須有一個聚集索引。

  • 數據行本身就直接存儲在聚集索引的葉子節點上。因此,表數據本身就是按聚集索引的順序物理存儲的。

  • 通常,聚集索引就是主鍵(PRIMARY KEY)。如果沒有定義主鍵,InnoDB會選擇一個唯一的非空索引代替。如果也沒有,則會隱式創建一個 rowid 作為聚集索引。

二級索引 (Secondary Index)
  • 也叫非聚集索引或輔助索引。

  • 二級索引的葉子節點存儲的不是完整的數據行,而是該行的主鍵值

  • 當通過二級索引查詢時,需要先找到對應的主鍵值,然后再回到聚集索引中根據主鍵查找完整的行數據。這個過程稱為回表 (Bookmark Lookup)

索引使用原則
  1. 最左前綴原則:對于聯合索引?(a, b, c),它可以用于查詢?a,?(a, b),?(a, b, c)?的條件,但不能用于跳過?a?直接查詢?b?或?c

  2. 覆蓋索引 (Covering Index):如果查詢的字段都包含在某個索引中(例如在索引?(a, b)?上查詢?a, b),則引擎可以直接從索引中獲取數據,而無需回表,極大提升性能。

  3. 索引下推 (Index Condition Pushdown, ICP):MySQL 5.6引入。在索引遍歷過程中,提前對索引中包含的字段進行WHERE條件過濾,減少回表的次數。

  4. ps:如果沒有索引下推優化(或稱ICP優化),當進行索引查詢時,首先根據索引來查找記錄,然后再根據where條件來過濾記錄;在支持ICP優化后,MySQL會在取出索引的同時,判斷是否可以進行where條件過濾再進行索引查詢。

總結與對比

特性MySQL Server查詢緩存InnoDB緩沖池 (Buffer Pool)
歸屬層面MySQL Server層InnoDB存儲引擎層
緩存內容完整的查詢結果集表和索引的數據頁
粒度粗(表級)細(頁級,通常16KB)
失效機制對表的任何寫操作導致所有相關緩存失效基于LRU算法和刷臟機制,精細管理
現狀MySQL 8.0中已移除InnoDB核心組件,至關重要
目的避免重復執行相同的SQL查詢減少磁盤I/O,加速數據訪問

因此,在現代MySQL(尤其是8.0+)的架構討論和性能優化中,我們關注的重點幾乎完全在?InnoDB緩沖池?上,而早已不再考慮已被廢棄的Server層查詢緩存。理解緩沖池的工作原理和大小設置,是優化數據庫性能的第一步,也是最關鍵的一步。

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

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

相關文章

Python實戰:實現監測抖音主播是否開播并錄屏

實現這個功能,主要思路是循環檢查主播狀態 → 開播后獲取直播流地址 → 使用FFmpeg錄制。下面是一個基本的步驟表格: 步驟 關鍵行動 常用工具/庫 1 獲取主播直播間ID或唯一標識 瀏覽器開發者工具、抓包工具1 2 循環請求抖音API,查詢主播直播狀態 requests, time 3 解析API響…

init / record / required:讓 C# 對象一次成型

標簽: init record required with表達式 不可變性 數據模型 DTO 目錄1. init 訪問器:讓不可變對象的創建更靈活1.1. 概念1.1.1. 語法1.1.2. 語義1.2. 設計初衷:解決什么問題?1.3. 使用方法1.3.1. 在對象初始化器中賦值&#xff08…

每天五分鐘深度學習:神經網絡的權重參數如何初始化

本文重點 在邏輯回歸的時候,我們可以將神經網絡的權重參數初始化為0(或者同樣的值),但是如果我們將神經網絡的權重參數初始化為0就會出問題,上節課程我們已經進行了簡單的解釋,那么既然初始化為0不行,神經網絡該如何進行參數初始化呢?神經網絡的權重參數初始化是模型訓…

[論文閱讀] 告別“數量為王”:雙軌道會議模型+LS,破解AI時代學術交流困局

告別“數量為王”:雙軌道會議模型LS,破解AI時代學術交流困局 論文信息信息類別具體內容論文原標題From Passive to Participatory: How Liberating Structures Can Revolutionize Our Conferences主要作者及機構1. Daniel Russo(丹麥奧爾堡大…

趣味學solana(介紹)

你就是那個關鍵的“守門員”! 為了方便理解Solana,我們把Solana 想象成一個巨大的、24小時不停歇的足球聯賽。成千上萬的足球運動員(用戶)在不停地傳球、射門(發送交易),而整個比賽的結果必須被…

分布式事務性能優化:從故障現場到方案落地的實戰手記(三)

第三部分:混合場景攻堅——從“單點優化”到“系統協同” 有些性能問題并非單一原因導致,而是鎖競爭與事務耗時共同作用的結果。以下2個案例,展示綜合性優化策略。 案例7:基金申購的“TCC性能陷阱”——從全量預留到增量確認 故障…

規則系統架構風格

考題 某公司擬開發一個VIP管理系統,系統需要根據不同商場活動,不定期更新VIP會員的審核標準和VIP折扣系統。針對上述需求,采用(__)架構風格最為合適。 A. 規則系統 B. 管道-過濾器風格 C. 事件驅動 D. 分層 一、什么是規則系統架構風格? 規則系統架構風格是一種將應…

kubeadm搭建生產環境的單master多node的k8s集群

k8s環境規劃: podSubnet(pod 網段) 10.20.0.0/16 serviceSubnet(service 網段): 10.10.0.0/16 實驗環境規劃: 操作系統:centos7.9 配置: 4G 內存/4核CPU/40G 硬盤 網絡:NAT K8s集群角色ip主…

React Device Detect 完全指南:構建響應式跨設備應用的最佳實踐

前言 在現代 Web 開發中,設備檢測是一個至關重要的功能。不同的設備(手機、平板、桌面)有著不同的屏幕尺寸、交互方式和性能特點,因此需要針對性地提供不同的用戶體驗。react-device-detect 是一個專門為 React 應用設計的設備檢…

Spark專題-第一部分:Spark 核心概述(2)-Spark 應用核心組件剖析

這一篇依然是偏理論向的內容,用兩篇理論搭建起Spark的框架,讓讀者有個基礎的認知,下一篇就可以開始sql的內容了 第一部分:Spark 核心概述(2) Spark 應用核心組件剖析 1. Job, Stage, Task 的三層架構 理解 …

KMP 字符串hash算法

kmp算法 最大相同真前后綴: 如 ababa的最大真前后綴為aba, 而不是ababa(真前后綴與真子集類似,不可是本身,不然沒意義) 所以next[1] 0;//string的下標從1開始 kmp模擬 next初始化&#xff…

HOT100--Day22--74. 搜索二維矩陣,34. 在排序數組中查找元素的第一個和最后一個位置,33. 搜索旋轉排序數組

HOT100–Day22–74. 搜索二維矩陣,34. 在排序數組中查找元素的第一個和最后一個位置,33. 搜索旋轉排序數組 每日刷題系列。今天的題目是《力扣HOT100》題單。 題目類型:二分查找。 關鍵: 今天的題目都是“多次二分” 74題&#xf…

Java分布式鎖實戰指南:從理論到實踐

Java分布式鎖實戰指南:從理論到實踐 前言 在分布式系統中,傳統的單機鎖機制無法滿足跨進程、跨機器的同步需求。分布式鎖應運而生,成為保證分布式系統數據一致性的關鍵技術。本文將全面介紹Java中分布式鎖的實現方式和最佳實踐。 1. 分布式鎖…

(二叉樹) 本節目標 1. 掌握樹的基本概念 2. 掌握二叉樹概念及特性 3. 掌握二叉樹的基本操作 4. 完成二叉樹相關的面試題練習

二叉樹1. 樹型結構(了解)1.1 概念1.2 概念(重要)1.3 樹的表示形式(了解)1.4 樹的應用2. 二叉樹(重點)2.1 概念2.2 兩種特殊的二叉樹2.3 二叉樹的性質2.4 二叉樹的存儲2.5 二叉樹的基…

【Zephyr電源與功耗專題】13_PMU電源驅動介紹

文章目錄前言一、PMU系統介紹二、Zephyr系統下驅動PMU的組成2.1:PMU系統在Zephyr上包括五大部分:2.2:功能說明2.3:B-core功能說明(Freertos)三、PMU各驅動API詳解3.1:Power_domain3.1.1:初始化3.1.2:rpmsg回…

華清遠見25072班網絡編程學習day5

作業0> 將IO多路復用實現TCP并發服務器實現一遍程序源碼&#xff1a;#include <25072head.h> #define SER_IP "192.168.153.128" //服務器ip地址 #define SER_PORT 8888 //服務器端口號 int main(int argc, const char *argv[]) {//1、創建一個…

【數據結構--順序表】

順序表和鏈表 1.線性表&#xff1a; 線性表是n個具有相同特性&#xff08;相同邏輯結構&#xff0c;物理結構&#xff09;的數據元素的有限序列。常見的線性表有&#xff1a;順序表&#xff0c;鏈表&#xff0c;棧&#xff0c;隊列&#xff0c;字符串…線性表在邏輯上是線性結構…

【PyTorch】圖像多分類部署

如果需要在獨立于訓練腳本的新腳本中部署模型&#xff0c;這種情況模型和權重在內存中不存在&#xff0c;因此需要構造一個模型類的對象&#xff0c;然后將存儲的權重加載到模型中。加載模型參數&#xff0c;驗證模型的性能&#xff0c;并在測試數據集上部署模型from torch imp…

FS950R08A6P2B 雙通道汽車級IGBT模塊Infineon英飛凌 電子元器件核心解析

一、核心解析&#xff1a;FS950R08A6P2B 是什么&#xff1f;1. 電子元器件類型FS950R08A6P2B 是英飛凌&#xff08;Infineon&#xff09; 推出的一款 950A/800V 雙通道汽車級IGBT模塊&#xff0c;屬于功率半導體模塊。它采用 EasyPACK 2B 封裝&#xff0c;集成多個IGBT芯片和二…

【系列文章】Linux中的并發與競爭[05]-互斥量

【系列文章】Linux中的并發與競爭[05]-互斥量 該文章為系列文章&#xff1a;Linux中的并發與競爭中的第5篇 該系列的導航頁連接&#xff1a; 【系列文章】Linux中的并發與競爭-導航頁 文章目錄【系列文章】Linux中的并發與競爭[05]-互斥量一、互斥鎖二、實驗程序的編寫2.1驅動…