3-001:MySQL 中的回表是什么?

1. 什么是回表?

回表(Back to Table) 指的是 在使用非聚簇索引(輔助索引)查詢時,MySQL 需要 先通過索引找到主鍵 ID,然后再回到主鍵索引(聚簇索引)查詢完整數據,這一過程稱為回表。


2. 回表的示例

假設有一張 users 表:

CREATE TABLE users (id INT PRIMARY KEY,       -- 主鍵name VARCHAR(50),         -- 用戶名age INT,                  -- 年齡address VARCHAR(255),      -- 地址INDEX idx_name (name)      -- 創建 name 的輔助索引
) ENGINE=InnoDB;

如果執行以下查詢:

SELECT address FROM users WHERE name = 'Alice';

查詢執行過程:

  1. 先查 idx_name 索引,找到 name='Alice' 對應的 id(假設 id = 3)。
  2. 再回表查詢,根據 id=3 在聚簇索引(主鍵索引)中找到 address 字段。

為什么要回表? 因為 idx_name 只存了 nameid,但 address 不在索引中,必須再回到主鍵索引查找完整數據。


3. 什么情況下會發生回表?

  • 查詢的字段不在索引覆蓋范圍內(即非覆蓋索引查詢)。
  • 使用二級索引(非主鍵索引)查詢,而查詢的字段不在索引列中。

4. 如何避免回表?

(1)使用覆蓋索引

如果查詢的字段已經包含在索引中,就可以避免回表

CREATE INDEX idx_name_age ON users(name, address);

然后執行:

SELECT address FROM users WHERE name = 'Alice';

此時,idx_name_age 索引已經包含 nameaddress,所以可以直接在索引中獲取數據,不需要回表

(2)使用主鍵查詢

如果使用 id(主鍵)查詢,就不需要回表:

SELECT address FROM users WHERE id = 3;

因為 InnoDB 的主鍵索引(聚簇索引)本身就存儲了完整數據,所以查詢 id 不會回表。


5. 總結

查詢方式是否回表原因
主鍵查詢 (SELECT * FROM users WHERE id = 3)? 不會因為主鍵索引(聚簇索引)包含完整數據
非主鍵索引查詢 (SELECT address FROM users WHERE name = ‘Alice’)? 會回表先查 name 索引,再回表查 address
覆蓋索引查詢 (SELECT name FROM users WHERE name = ‘Alice’)? 不會name 索引已經包含查詢字段

🚀 結論: MySQL InnoDB 避免回表的方法

  1. 盡量使用覆蓋索引(讓查詢的所有字段都包含在索引中)。
  2. 使用主鍵查詢,避免使用非主鍵索引查詢非索引字段。
  3. 分析 EXPLAIN 結果,關注 Extra 字段是否包含 "Using index"(表示使用了覆蓋索引)。

這樣可以減少回表,提高查詢性能!🚀

6. 拓展:二級索引的葉子節點和非葉子節點存儲內容**

6.1 二級索引 B+ 樹結構示意

假設有如下 users 表:

CREATE TABLE users (id INT PRIMARY KEY,  -- 聚簇索引name VARCHAR(50),age INT,INDEX idx_age (age)   -- 二級索引
);

其中,表中的數據如下:

idnameage
1Alice25
2Bob30
3Charlie35

6.2 完整的二級索引 B+ 樹結構
                (30)/    \(25)      (35)/      \     /    \(age=25,id=1) (age=30,id=2) (age=35,id=3)
6.3 📌 結構解析
  • 非葉子節點(索引鍵)
    • 只存儲 索引列 age,用于 快速查找數據所在的葉子節點
    • 例如,30 代表左側存 <30 的數據,右側存 >=30 的數據。
  • 葉子節點(存儲實際索引數據)
    • 存儲 索引列 age主鍵 id,但 不存儲完整數據
    • 例如,葉子節點 (age=30, id=2) 說明 age=30 的數據,主鍵 id=2
    • 葉子節點 通過主鍵 id 回表查詢完整數據

6.4 二級索引查詢流程

查詢 SELECT * FROM users WHERE age = 30;

  1. 從非葉子節點找到 30 對應的葉子節點。
  2. 葉子節點存儲 (age=30, id=2),返回 id=2。
  3. 回表:用 id=2 查詢 users 表的主鍵索引,獲取完整數據。

6.5 🔥 關鍵點總結
  1. 非葉子節點 只存索引 key(age),不存儲數據
  2. 葉子節點age主鍵 ID,用于返回 ID 進行回表查詢。
  3. 回表查詢 是因為 二級索引不存完整數據,需要用主鍵 ID 進一步查詢。
  4. 優化方式:
    • 覆蓋索引(例如 INDEX idx_age_name (age, name)),讓查詢字段直接存入索引,避免回表。
    • 合理設計主鍵,避免主鍵過大影響二級索引的存儲效率。

這樣,你對二級索引的 存儲結構和查詢流程 是否更加清晰了呢? 😊🚀

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

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

相關文章

【AIGC】計算機視覺-YOLO系列家族

YOLO系列家族 &#xff08;1&#xff09;YOLO發展史&#xff08;2&#xff09; YOLOX&#xff08;3&#xff09; YOLOv6&#xff08;4&#xff09; YOLOv7&#xff08;5&#xff09; YOLOv8&#xff08;6&#xff09; YOLOv9&#xff08;7&#xff09;YOLOv10&#xff08;8&…

基于Python懂車帝汽車數據分析平臺(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 時代在飛速進步&#xff0c;每個行業都在努力發展現在先進技術&#xff0c;通過這些先進的技術來提高自己的水平和優勢&#xff0c;汽車數據分析平臺當然不能排除在外。本次我所開發的懂車帝汽車數據分析平臺是在實際應用和軟件工程的開發原理之上&#xff0c;運用Python…

Prompt 工程

一、提示原則 import openai import os import openai from dotenv import load_dotenv, find_dotenv from openai import OpenAI def get_openai_key():_ load_dotenv(find_dotenv())return os.environ[OPENAI_API_KEY]client OpenAI(api_keyget_openai_key(), # This is …

MySQL -- 數據庫基礎

1、基礎登錄操作 mysql 指定選項 選項&#xff1a; <1> -h 指定ip地址&#xff0c;即連接的主機&#xff0c;不帶時&#xff0c;默認連本機 <2> -P 指定的端口號&#xff0c;指定默認端口號&#xff08;配置文件中進行配置&#xff09; <3>-u 指定的用戶 &l…

02C#基本結構篇(D3_內部類-代碼塊-數據類型-變量-常量-字面量-運算符-流程控制語句)

目錄 一、內部類 1. 定義內部類 2. 創建內部類的實例 3. 訪問外部類的私有成員 4. 內部靜態類 5. 使用場景和優點 6. 注意事項 ------------------------------------------- 二、代碼塊 1. 控制流語句 1.1. 條件語句 1> if 語句 2> switch 語句 1.2. 循環語…

15 | 定義簡潔架構 Store 層的數據類型

提示&#xff1a; 所有體系課見專欄&#xff1a;Go 項目開發極速入門實戰課&#xff1b;歡迎加入 云原生 AI 實戰 星球&#xff0c;12 高質量體系課、20 高質量實戰項目助你在 AI 時代建立技術競爭力&#xff08;聚焦于 Go、云原生、AI Infra&#xff09;&#xff1b;本節課最終…

CSDN統計個人創作總字數

前言 不是很懂爬蟲&#xff0c;所以就叫deepseek寫了一個 用起來很簡單&#xff0c;但是有一個小問題&#xff0c;就是統計的是總字符數。代碼片會被統計進去&#xff0c;Markdown語法也會被統計進去。 不過我沒有太多需求&#xff0c;能大概統計一下滿足以下小小的好奇心和成…

React.js 基礎與進階教程

React.js 基礎與進階教程 React.js 是由 Facebook 開發的流行前端 JavaScript 庫&#xff0c;專為構建用戶界面&#xff08;UI&#xff09;設計&#xff0c;尤其適用于單頁面應用&#xff08;SPA&#xff09;。它采用組件化開發模式&#xff0c;使 UI 結構更加清晰、可維護性更…

msf(Metasploit)中Session與Channel的區別與關系解析

在 Metasploit Framework&#xff08;MSF&#xff09;中&#xff0c;Session 和 Channel 都是與目標主機的交互方式&#xff0c;但它們的作用和概念有所不同。本文將解析這兩個術語的區別。 一、Session&#xff08;會話&#xff09; Session 是指通過 Metasploit 成功利用目標…

設計模式-結構型模式-裝飾器模式

概述 裝飾器模式 : Decorator Pattern : 是一種結構型設計模式. 作用 &#xff1a; 允許你動態地給對象添加功能或職責&#xff0c;而無需修改其原始類的代碼,非常的符合 開閉原則。 實現思路 &#xff1a;通過創建一個包裝對象&#xff08;即裝飾器&#xff09;&#xff0c;來…

Qt/C++音視頻開發82-系統音量值獲取和設置/音量大小/靜音

一、前言 在音視頻開發中&#xff0c;音量的控制分兩塊&#xff0c;一個是控制播放器本身的音量&#xff0c;絕大部分場景都是需要控制這個&#xff0c;這個不會影響系統音量的設置。還有一種場景是需要控制系統的音量&#xff0c;因為播放器本身的音量是在系統音量的基礎上控…

基于深度學習的醫學CT圖像肺結節智能檢測與語音提示系統【python源碼+Pyqt5界面+數據集+訓練代碼】

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

前端小食堂 | Day14 - Vue 3 の傳送門與懸念

&#x1f300; 今日秘技&#xff1a;Teleport 與 Suspense の時空魔法 1. Teleport 任意門 <template> <!-- &#x1f6aa; 將組件傳送到 body 末尾 --> <Teleport to"body"> <div class"modal"> <h2>重要通知&#x…

emacs使用mongosh的方便工具發布

github項目地址: GitHub - csfreebird/emacs_mongosh: 在emacs中使用mongosh快速登錄mongodb數據庫 * 用途 在emacs中使用mongosh快速登錄mongodb數據庫&#xff0c; 操作方法: M-x mongosh, 輸入數據庫名稱&#xff0c;然后就可以自動登錄&#xff0c;前提是你已經配置好了…

Linux:Ubuntu server 24.02 上搭建 ollama + dify

一、安裝Ubuntu 具體的安裝過程可以參見此鏈接&#xff1a;鏈接&#xff1a;Ubuntu Server 20.04詳細安裝教程&#xff0c;這里主要記錄一下過程中遇到的問題。 安裝時subnet如何填寫 在Ubuntu中subnet填寫255.255.255.0是錯誤的&#xff0c;其格式為 xx.xx.xx.xx/yy &#…

unordered_set 的常用函數

在 C 的標準庫中&#xff0c;std::unordered_set 是基于哈希表實現的哈希集合。下面介紹這種語言里哈希集合的常用函數。 C std::unordered_set 1. 元素操作 insert 功能&#xff1a;向哈希集合中插入元素。如果元素已經存在&#xff0c;則不會重復插入。示例代碼&#xff1a…

starrocks批量啟停腳本

#!/bin/bash # 定義 StarRocks 安裝目錄 STARROCKS_HOME"/path/to/starrocks" # 定義 FE 和 BE 節點列表 FE_NODES("fe_node1_ip" "fe_node2_ip" "fe_node3_ip") BE_NODES("be_node1_ip" "be_node2_ip" "be_…

python 提取視頻中的音頻

在Python中提取視頻中的音頻&#xff0c;你可以使用moviepy庫&#xff0c;這是一個非常強大且易于使用的庫&#xff0c;專門用于視頻編輯。以下是如何使用moviepy來提取視頻中的音頻的步驟&#xff1a; 安裝moviepy 首先&#xff0c;你需要安裝moviepy。你可以通過pip安裝它&a…

大語言模型打卡學習DAY1

學習目標&#xff1a; 語言模型的發展歷程 大模型的技術基礎 學習內容&#xff1a; 1. 語言模型的發展歷程 語言模型通常是指能夠建模自然語言文本生成概率的模型&#xff0c;從語言建模到任務求解&#xff0c;這是科學思維的一次重要躍升。2. 大語言模型技術基礎 定義&#…

boarding_passes(登機牌)表的作用

boarding_passes&#xff08;登機牌&#xff09;表的作用 boarding_passes 這張表的主要作用是記錄旅客的登機信息&#xff0c;包括&#xff1a; 票號 (ticket_no) - 關聯到 tickets 表&#xff0c;表示這張票屬于哪個旅客。航班 ID (flight_id) - 關聯到 flights 表&#xf…