mysql 回表查詢(二次查詢,如何檢查,如何規避)

h5打開以查看

“回表查詢”通常發生在使用二級索引(Secondary Index)的查詢中。當查詢所需的數據列并不全部包含在二級索引中時,即使使用了索引,MySQL 也需要根據索引記錄中的主鍵值,回到聚簇索引(Clustered Index)的主鍵 B+Tree 中去查找完整的行數據,這個過程就叫做“回表”。


核心方法:使用?EXPLAIN?命令

檢測回表查詢最主要、最直接的工具就是 MySQL 的?EXPLAIN?命令。你需要重點關注?EXPLAIN?輸出中的以下幾個字段:

1.?type?(訪問類型)

這個字段顯示了 MySQL 決定如何查找表中的行。

  • eq_ref,?ref,?range,?index_scan: 這些通常是好的類型,表示使用了索引的有效查找。

  • index:?這是一個關鍵信號!?type = index?通常意味著 MySQL 正在掃描整個二級索引(全索引掃描)。這通常發生在需要從索引中獲取大量數據,然后回表的情況下。它比全表掃描(ALL)快,但依然不高效。

  • ALL: 最壞的情況,全表掃描,根本沒用上索引。

2.?key?和?key_len?(使用的索引)
  • key: 顯示 MySQL 實際決定使用的索引。

  • key_len: 顯示使用的索引鍵的長度。通過這個長度,你可以判斷索引是否被完全使用(覆蓋了查詢條件的所有列)。如果?key_len?小于索引定義的長度,說明只使用了索引的前面一部分,這可能不是最優的。

3.?Extra?(額外信息)

這是判斷回表最重要的字段

  • Using index:?這是最理想的情況,表示出現了“覆蓋索引”(Covering Index)。查詢的所有字段都包含在使用的索引中,MySQL 只需要讀取索引即可返回結果,完全不需要回表。這是優化的重要目標。

  • Using index condition: 表示使用了 Index Condition Pushdown (ICP) 優化,服務器層將部分條件(WHERE?子句)下推給存儲引擎層進行過濾,但仍然可能需要回表

  • Using where:?這通常意味著需要回表。表示存儲引擎從索引中讀取行后,需要在 MySQL 服務器層再根據?WHERE?條件進行過濾。服務器層過濾的數據,就是已經從聚簇索引中取回的完整行數據。


實戰演示:如何一步步檢測

假設我們有一張用戶表?users

sql

CREATE TABLE `users` (`id` int NOT NULL AUTO_INCREMENT,`name` varchar(100) DEFAULT NULL,`age` int DEFAULT NULL,`city` varchar(100) DEFAULT NULL,`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (`id`),KEY `idx_name_age` (`name`,`age`) -- 一個聯合索引
) ENGINE=InnoDB;
場景 1:覆蓋索引,無需回表(理想情況)

sql

EXPLAIN SELECT name, age FROM users WHERE name = 'John';

分析?EXPLAIN?結果:

  • type:?ref?(使用了索引等值查詢)

  • key:?idx_name_age?(使用了我們創建的聯合索引)

  • Extra:?Using index

    • 結論:太好了!查詢的?name?和?age?字段都包含在?idx_name_age?索引中。MySQL 只需讀取索引文件,無需回表,性能極高。

場景 2:需要回表的查詢(常見情況)

sql

EXPLAIN SELECT * FROM users WHERE name = 'John';
-- 或者
EXPLAIN SELECT name, age, city FROM users WHERE name = 'John'; -- city 不在索引中

分析?EXPLAIN?結果:

  • type:?ref?(依然使用了索引)

  • key:?idx_name_age?(使用了索引來快速定位記錄)

  • Extra:?NULL?或者?Using where

    • 結論:發生了回表。idx_name_age?索引中只有?(name, age, id)(id是主鍵,會自動附加到二級索引中),但沒有?city?字段。為了獲取?city?和?created_at?等所有字段,MySQL 必須根據找到的?id?值,回到聚簇索引中去查找完整的行數據。

場景 3:全索引掃描,然后回表

sql

EXPLAIN SELECT * FROM users WHERE age > 20;

分析?EXPLAIN?結果:

  • type:?index

  • key:?idx_name_age

  • Extra:?Using where

    • 結論:這是一個非常典型的低效查詢。我們的索引是?(name, age),但查詢條件從?age?開始,無法使用索引的最左前綴原則。因此,MySQL 會選擇掃描整個?idx_name_age?索引,對每一條索引記錄檢查?age > 20?的條件,然后為每一個匹配的索引記錄回表獲取完整數據。性能很差。


總結:檢測與優化回表查詢的步驟

  1. 使用?EXPLAIN: 對任何性能存疑的查詢都使用?EXPLAIN?分析。

  2. 查看?Extra?列

    • 如果看到?Using index,恭喜你,沒有回表。

    • 如果看到?Using where?且?type?是?ref?或?index,很可能發生了回表。

  3. 查看?type?列: 如果值是?index,說明正在全索引掃描,通常伴隨著大量回表,需要優化。

  4. 優化策略

    • 創建覆蓋索引: 如果回表查詢很頻繁,考慮創建一個“覆蓋索引”,將查詢中涉及的所有字段(SELECT 和 WHERE 中的字段)都包含在索引中。例如,對于?SELECT id, name, city FROM users WHERE name = ?,可以創建索引?(name, city)?或?(name, city, id)?來覆蓋查詢。

    • 避免?SELECT *: 只獲取你真正需要的列,減少需要回表獲取的數據量,也更容易實現覆蓋索引。

    • 使用索引的最左前綴原則: 確保查詢條件能有效利用索引。

通過系統性地使用?EXPLAIN?并關注上述關鍵字段,你可以準確地識別和優化數據庫中的回表查詢,從而極大提升查詢性能。

h5打開以查看

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

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

相關文章

深度學習(二):神經元與神經網絡

在人工智能的浪潮中,神經網絡(Neural Networks)無疑是驅動核心技術的引擎,它賦予了計算機前所未有的學習和識別能力。而這一切的起點,是受到生物大腦中基本單元——神經元(Neurons)的深刻啟發。…

JavaScript 行為型設計模式詳解

1. 觀察者模式1.1. 使用場景觀察者模式用于對象間的一對多依賴關系,當一個對象的狀態發生變化時,所有依賴于它的對象都能收到通知并自動更新。常用于事件處理、通知系統。在前端中,觀察者模式用于實現事件監聽、數據綁定等功能。1.2. 代碼實現…

指令查找表LUT

本文整理自22. FlexSPI—讀寫外部SPI NorFlash — [野火]i.MX RT庫開發實戰指南——基于i.MXRT1052 文檔 用作個人學習和分享 指令查找表LUT 訪問FLASH存儲器通常包含一些讀寫功能的的控制指令,主控設備可通過這些指令訪問FLASH存儲器。 為了適應這種需求&#…

uv使用指南

🚀 Python 打包工具 UV 使用指南 UV 是一個用 Rust 編寫的極速 Python 包管理器和解析器,旨在成為 pip、pip-tools、virtualenv 等工具的單一替代方案。 📋 目錄 核心概念與設計哲學安裝與配置基礎使用方法項目管理與工作流高級功能與技巧…

安卓學習 之 圖片控件和圖片按鈕

今天學習的是ImageView 和 ImageButton這兩個控件還是比較簡單的:先來看看最后的樣式圖片吧:從圖片中可以看到ImageView中的圖片要大很多,這是因為中的ImageView中的圖片跟ImageView控件的大小而自動調整。Imag…

動態規劃-學習筆記

這是一份動態規劃(Dynamic Programming, DP)完整學習筆記。筆記將從一星難度(入門)到五星難度(進階),循序漸進,涵蓋核心思想、經典模型和解題方法論。 本來打算今天更新背包問題的題…

Linux 可信啟動深度解析:從UEFI到操作系統的信任鏈

文章目錄引言一、 可信根基:TPM與核心概念1.1 什么是“度量” (Measurement)?1.2 信任鏈與TPM PCR二、 階段一:固件的可信啟動 (UEFI)2.1 引導的起點:從SEC到DXE的初始化2.2 引導設備選擇 (BDS):UEFI如何找到GRUB2.3 S…

61-python中面向對象三大特性

前言: 面向對象編程,是許多編程語言都支持的一種編程思想。簡單理解是:基于模板(類)去創建實體(對象), 使用對象完成功能開發。面向對象包含三大主要特性: 封裝 繼承 多態…

BP-Adaboost模型

BP-Adaboost模型是一種將BP神經網絡作為弱分類器的集成學習框架,通過AdaBoost算法動態調整樣本權重和模型權重,顯著提升預測精度和泛化能力。一、模型架構與工作原理 1. 基礎框架 弱分類器單元:采用單隱藏層BP神經網絡(結構示例&a…

k230 +canMV+ LVGL控件 仿手表表盤觸摸屏滾動、選中后彈窗效果完整示例程序

現在智能手表用的越來越多,其交互方式比較有特點,現在k230開發板上,基于LVGL(Light and Versatile Graphics Library)編寫一個嵌入式GUI應用程序,使用LVGL配合觸摸屏實現模仿智能手表的表盤滾動效果,實際效果如下: 程序使用LVGL圖形庫和MediaManager程序,創建帶有觸摸…

使用Vue.js和WebSocket打造實時庫存儀表盤

大家好!今天我將分享一個簡單卻強大的實時庫存儀表盤項目,基于Vue.js和WebSocket技術。這個項目適合初學者學習前端實時數據處理,也能為你的技術博客或作品集增添亮點!通過這個教程,你將學會如何使用WebSocket實現實時…

leecode100——接雨水

題目 雙指針 思路1 使用參數存儲從左往右(從右往左同理)遍歷時的最高的柱子, 然后移動左右的指針,每次移動左右指針中偏向小的, 如果當前指針指的柱子小于最高的柱子,就會存在接到水。 思路2 把水看作柱子&…

復古膠片風格街拍人像Lr調色教程,手機濾鏡PS+Lightroom預設下載!

調色教程復古膠片風格街拍人像 Lightroom 調色,通過模擬經典膠片相機的色彩科學,為現代數碼照片注入懷舊韻味。這種調色手法注重低飽和度色彩、柔和的高光過渡和豐富的暗部細節,配合適度的顆粒感,營造出時光沉淀的質感。特別適合街…

Linux的gpio子系統

GPIO其實也是某個pin的功能之一。上一小節講解了 pinctrl 子系統,pinctrl 子系統重點是設置 PIN(有的 SOC 叫做 PAD)的復用和電氣屬性,如果 pinctrl 子系統將一個 PIN 復用為 GPIO 的話,那么接下來就要用到 gpio 子系統了。gpio 子系統顧名思…

VC++ CPU指令集檢測工具實現原理

📈 VC CPU指令集檢測工具實現原理 例圖:🧠 1. 核心原理:CPUID指令 // 使用CPUID指令獲取CPU信息 int cpuInfo[4] { -1 }; __cpuid(cpuInfo, 0); // 調用CPUID指令 int nIds cpuInfo[0]; // 獲取最大標準功能號CPUID指令工作流程…

大模型微調理論、實戰:LLaMA-Factory、Unsloth

概述 微調,Fine-Tuning,簡稱FT,可理解為對LLM的定制,目的是增強專業領域知識,并優化特定任務的性能。通過在特定數據集上微調一個預訓練模型,可實現: 更新知識:引入新的領域專屬信…

【LCA 樹上倍增】P9245 [藍橋杯 2023 省 B] 景區導游|普及+

本文涉及知識點 樹上倍增 P9245 [藍橋杯 2023 省 B] 景區導游 題目描述 某景區一共有 NNN 個景點,編號 111 到 NNN。景點之間共有 N?1N-1N?1 條雙向的擺渡車線路相連,形成一棵樹狀結構。在景點之間往返只能通過這些擺渡車進行,需要花費…

基于Python+Streamlit的旅游數據分析與預測系統:從數據可視化到機器學習預測的完整實現

🏞? 基于PythonStreamlit的旅游數據分析與預測系統:從數據可視化到機器學習預測的完整實現 📝 前言 在大數據時代,旅游行業的數據分析變得越來越重要。如何從海量的旅游數據中挖掘有價值的信息,并進行準確的銷量預測&…

飛算JavaAI全鏈路實戰:智能構建高可用電商系統核心架構

飛算JavaAI全鏈路實戰:智能構建高可用電商系統核心架構 前言:AI編程新時代的電商系統開發范式變革 在當今數字經濟時代,電商系統作為企業數字化轉型的核心載體,其復雜度和技術要求與日俱增。一個完整的電商系統不僅需要處理商品、…

論文精讀(五):面向鏈接預測的知識圖譜表示學習方法綜述

筆者鏈接:撲克中的黑桃A 專欄鏈接:論文精讀 本文關鍵詞:知識圖譜; 表示學習; 鏈接預測; 多元關系; 超關系 引 諸位技術同仁: 本系列將系統精讀的方式,深入剖析計算機科學頂級期刊/會議論文,聚焦前沿突破…