sql高級之回表

避免回表是數據庫查詢優化的核心目標之一,指通過索引直接獲取查詢所需的全部數據,無需根據索引結果再回主表(數據行)讀取其他字段,從而減少磁盤 I/O 和計算開銷。以下是詳細解釋:

1. 什么是回表?

(1) 索引結構回顧

? 索引本質:類似書籍目錄,存儲字段值的 有序引用,指向表中對應的數據行(行地址或主鍵)。

? 非覆蓋索引:索引字段未包含查詢所需的所有列,需回表獲取其他字段。

? 覆蓋索引:索引字段包含查詢所需的所有列,無需回表。

(2) 回表示例

假設表 users 的結構和索引如下:

CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(50),age INT,INDEX idx_age (age)  -- 非覆蓋索引(僅含 age 和主鍵 id)
);

執行查詢:

SELECT name, age FROM users WHERE age > 20;

執行過程:

  1. 通過索引 idx_age 找到所有 age > 20 的記錄,得到主鍵 id 列表。
  2. 根據 id 回表逐行讀取 nameage 字段。

2. 如何避免回表?

(1)創建覆蓋索引

確保索引包含查詢所需的所有字段,例如:

CREATE INDEX idx_cover ON users (age, name);

此時索引 idx_cover 包含 agename,執行 SELECT name, age 時無需回表。

(2) 優化查詢字段

減少查詢字段數量,或僅選擇索引覆蓋的字段:

-- 優化前(需要回表)
SELECT * FROM users WHERE age > 20;-- 優化后(無需回表)
SELECT age, id FROM users WHERE age > 20;  -- 僅需索引字段

3. 回表的性能影響

場景磁盤 I/O性能
無索引全表掃描最差
非覆蓋索引 + 回表索引掃描 + 回表中等
覆蓋索引僅索引掃描最優

示例對比:
? 表 users 有 100 萬行數據,索引 idx_age 大小為 10MB,主表大小為 200MB。

? 回表查詢:讀取 10MB 索引 + 50MB 數據行 → 總計 60MB I/O。

? 覆蓋索引:僅讀取 10MB 索引 → 節省 83% I/O。

4. 如何判斷是否發生回表?

通過 EXPLAIN 查看執行計劃:
? Using index:使用覆蓋索引,未回表。

? Using index condition:使用索引條件下推(ICP),可能部分回表。

? Using where; Using index:覆蓋索引過濾數據,無需回表。

? 無上述提示:表示需要回表。

5. 實際案例分析

場景:訂單表查詢
表結構:

CREATE TABLE orders (order_id INT PRIMARY KEY,user_id INT,amount DECIMAL(10,2),create_time DATETIME,INDEX idx_user_time (user_id, create_time)
);

查詢:

SELECT user_id, amount FROM orders WHERE user_id = 100 AND create_time > '2024-01-01';

問題:索引 idx_user_time 包含 user_idcreate_time,但未包含 amount,需要回表讀取 amount

優化:創建覆蓋索引:

CREATE INDEX idx_cover ON orders (user_id, create_time, amount);

此時索引包含所有查詢字段,無需回表。

6. 權衡與注意事項

? 索引體積:覆蓋索引字段越多,索引體積越大,可能影響寫入性能。

? 高頻查詢優先:僅為高頻且性能關鍵的查詢創建覆蓋索引。

? 更新代價:索引字段更新時,需同步更新索引,可能增加鎖競爭。

總結

避免回表是提升查詢性能的關鍵手段,通過 覆蓋索引設計 和 查詢字段精簡,可顯著減少 I/O 和計算開銷。優化時需結合業務場景,權衡查詢性能與索引維護成本。

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

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

相關文章

第十一屆機械工程、材料和自動化技術國際會議(MMEAT 2025)

重要信息 官網:www.mmeat.net 時間:2025年06月23-25日 地點:中國-深圳 部分展示 征稿主題 智能制造和工業自動化 復合材料與高性能材料先進制造技術 自動化機器人系統 云制造與物聯網集成 精密制造技術 智能生產線優化 實時數據分析與過…

動態自適應分區算法(DAPS)設計流程詳解

動態自適應分區算法(Dynamic Adaptive Partitioning System, DAPS)是一種通過實時監測系統狀態并動態調整資源分配策略的智能算法,廣泛應用于緩存優化、分布式系統、工業制造等領域。本文將從設計流程的核心步驟出發,結合數學模型…

從入門到精通:CMakeLists.txt 完全指南

從入門到精通:CMakeLists.txt 完全指南 CMake 是一個跨平臺的自動化構建系統,它使用名為 CMakeLists.txt 的配置文件來控制軟件的編譯過程。無論你是剛接觸 CMake 的新手,還是希望提升 CMake 技能的中級開發者,這篇指南都將帶你從…

CPT204 Advanced Obejct-Oriented Programming 高級面向對象編程 Pt.8 排序算法

文章目錄 1. 排序算法1.1 冒泡排序(Bubble sort)1.2 歸并排序(Merge Sort)1.3 快速排序(Quick Sort)1.4 堆排序(Heap Sort) 2. 在面向對象編程中終身學習2.1 記錄和反思學習過程2.2 …

【element plus】解決報錯error:ResizeObserver loop limit exceeded的問題

當我們在使用element plus框架時,有時會遇到屏幕突然變暗,然后來一句莫名其妙的報錯ResizeObserver loop limit exceeded,其實這是因為改變屏幕大小時el-table導致的報錯 網上給出了幾種解決方案,我試了其中兩種可以實現 方案一&…

LeetCode算法題(Go語言實現)_60

題目 給你一個整數數組 cost ,其中 cost[i] 是從樓梯第 i 個臺階向上爬需要支付的費用。一旦你支付此費用,即可選擇向上爬一個或者兩個臺階。 你可以選擇從下標為 0 或下標為 1 的臺階開始爬樓梯。 請你計算并返回達到樓梯頂部的最低花費。 一、代碼實現…

馬架構的Netty、MQTT、CoAP面試之旅

標題:馬架構的Netty、MQTT、CoAP面試之旅 在互聯網大廠的Java求職者面試中,一位名叫馬架構的資深Java架構師正接受著嚴格的考驗。他擁有十年的Java研發經驗和架構設計經驗,尤其對疑難問題和線索問題等有著豐富的經歷。 第一輪提問&#xff…

焦化燒結行業無功補償解決方案—精準分組補償 穩定電能質量沃倫森

在焦化、燒結等冶金行業,負荷運行呈現長時階梯狀變化,功率波動相對平緩,但對無功補償的分組精度要求較高。傳統固定電容器組補償方式無法動態跟隨負荷變化,導致功率因數不穩定,甚至可能因諧波放大影響電網安全。 行業…

使用String path = FileUtilTest.class.getResource(“/1.txt“).getPath(); 報找不到路徑

在windows環境運行,下面的springboot中path怎么找不到文件呢? path輸出后的結果是:路徑是多少:/D:/bjpowernode/msb/%e4%b9%90%e4%b9%8b%e8%80%85/apache%20commons/SpringBootBase6/target/test-classes/1.txt 怎么解決一下呢&am…

【C++】二叉樹進階面試題

根據二叉樹創建字符串 重點是要注意括號省略問題,分為以下情況: 1.左字樹為空,右子樹不為空,左邊括號保留 2.左右子樹都為空,括號都不保留 3。左子樹不為空,右子樹為空,右邊括號不保留 如果根節…

RSUniVLM論文精讀

一些收獲: 1. 發現這篇文章的table1中,有CDChat ChangeChat Change-Agent等模型,也許用得上。等會看看有沒有源代碼。 摘要:RSVLMs在遙感圖像理解任務中取得了很大的進展。盡管在多模態推理和多輪對話中表現良好,現有模…

低空AI系統的合規化與標準化演進路徑

隨著AI無人機集群逐步參與城市空域治理、物流服務與公共安全作業,其系統行為不再是“技術封閉域”,而需接受法規監管、責任評估與接口協同的多方審查。如何將AI集群系統推向標準化、可接入、可審計的合規體系,成為未來空中交通演進的關鍵。本…

【金倉數據庫征文】從云計算到區塊鏈:金倉數據庫的顛覆性創新之路

目錄 一、引言 二、金倉數據庫概述 2.1 金倉數據庫的背景 2.2 核心技術特點 2.3 行業應用案例 三、金倉數據庫的產品優化提案 3.1 性能優化 3.1.1 查詢優化 3.1.2 索引優化 3.1.3 緩存優化 3.2 可擴展性優化 3.2.1 水平擴展與分區設計 3.2.2 負載均衡與讀寫分離 …

致遠oa部署

文章目錄 環境搭建項目構建 僅供學習使用 環境搭建 準備項目: https://pan.quark.cn/s/04a166575e94 https://pan.xunlei.com/s/VOOc1c9dBdLIuU8KKiqDa68NA1?pwdmybd# 官方文檔: https://open.seeyoncloud.com/v5devCTP/ 安裝時 mysql 數據庫可能出現字符集設置…

移遠通信智能模組助力東成“無邊界智能割草機器人“閃耀歐美市場

2025年4月21日,移遠通信宣布,旗下SC206E-EM智能模組已成功應用于江蘇東成電動工具有限公司旗下的DCK TERRAINA無邊界智能割草機器人。 這款智能模組高度集成計算、通信、定位等多元能力,以小型化、低功耗、實時性強和低成本等綜合優勢&#…

100.HTB-Meow

學習成果 在第一層,您將獲得網絡安全滲透測試領域的基本技能。您將首先學習如何匿名連接到各種服務,例如 FTP、SMB、Telnet、Rsync 和 RDP。接下來,您將發現 Nmap 的強大功能,Nmap 是一個有價值的工具,用于識別目標系統…

大廠面試-redis

前言 本章內容來自B站黑馬程序員java大廠面試題和小林coding 博主學習筆記,如果有不對的地方,海涵。 如果這篇文章對你有幫助,可以點點關注,點點贊,謝謝你! 1.redis的使用場景 1.1 緩存 緩存穿透 在布…

【含文檔+PPT+源碼】基于SpringBoot+vue的疫苗接種系統的設計與實現

項目介紹 本課程演示的是一款 基于SpringBootvue的疫苗接種系統的設計與實現,主要針對計算機相關專業的正在做畢設的學生與需要項目實戰練習的 Java 學習者。 1.包含:項目源碼、項目文檔、數據庫腳本、軟件工具等所有資料 2.帶你從零開始部署運行本套系…

【Pandas】pandas DataFrame dot

Pandas2.2 DataFrame Binary operator functions 方法描述DataFrame.add(other)用于執行 DataFrame 與另一個對象(如 DataFrame、Series 或標量)的逐元素加法操作DataFrame.add(other[, axis, level, fill_value])用于執行 DataFrame 與另一個對象&…

Windows上Tomcat 11手動啟動startup.bat關閉shutdown.bat

發現tomcat11無法手動雙擊startup.bat和shutdown.bat進行開啟和關閉。雙擊startup.bat命令窗口一閃而過就是啟動失敗了,正常啟動成功是cmd命令窗口有全副的執行輸出且不關閉窗口。 解決方法如下:主要更改一個tomcat安裝目錄下的/conf/server.xml配置 1.…