MySQL 索引的最左前綴匹配原則是什么?

MySQL 索引的最左前綴匹配原則詳解

最左前綴匹配原則(Leftmost Prefix Principle)是 MySQL 復合索引(聯合索引)查詢優化中的核心規則,理解這一原則對于高效使用索引至關重要。

核心概念

定義:當查詢條件包含復合索引的最左列或連續前綴列時,索引才能被有效利用;若跳過最左列或列順序不連續,則無法利用索引的全部或部分功能。


核心規則與示例解析

1. 索引列順序決定匹配范圍

假設有復合索引 (a, b, c)

  • 有效查詢
    WHERE a = 1 AND b = 2 AND c = 3  -- 完全匹配索引列
    WHERE a = 1 AND b = 2            -- 匹配前兩列
    WHERE a = 1                      -- 僅匹配第一列
    
  • 無效查詢
    WHERE b = 2 AND c = 3            -- 跳過最左列a,索引失效
    WHERE c = 3                      -- 僅使用索引末尾列,全表掃描
    

2. 范圍查詢中斷后續列匹配

當使用 ><BETWEENLIKE(非前綴匹配)等范圍查詢時,該列后的索引列將失效:

-- 索引 (a, b, c)
WHERE a = 1 AND b > 10 AND c = 3  -- 僅a和b有效,c失效
WHERE a = 1 AND b LIKE '張%' AND c = 3  -- 若LIKE是前綴匹配,c仍有效

3. 排序與分組的最左前綴依賴

  • 排序ORDER BY 需與索引列順序一致:
    -- 索引 (a, b, c)
    ORDER BY a, b, c  -- 有效
    ORDER BY a, c     -- 僅a有效,c無法利用索引
    
  • 分組GROUP BY 需包含最左前綴列:
    GROUP BY a, b     -- 有效
    GROUP BY b, c     -- 無效
    

4. 函數/計算導致索引失效

對索引列使用函數或計算會破壞最左前綴:

-- 索引 (a, b, c)
WHERE YEAR(a) = 2023  -- 索引失效(對a列使用函數)
WHERE a + 1 = 10       -- 索引失效(對a列進行計算)

優化實踐建議

  1. 設計復合索引時

    • 高選擇性列(區分度高的列)放在左側
    • 等值查詢列放在范圍查詢列之前
    • 避免將頻繁更新的列作為索引首列
  2. 查詢重構技巧

    • 范圍查詢優化:將范圍條件后置或拆分為多個查詢
      -- 原查詢(索引(a,b,c)):
      WHERE a = 1 AND b > 10 AND c = 3  -- c失效
      -- 優化方案:
      SELECT * FROM t WHERE a=1 AND c=3 AND b > 10  -- 調整順序無效,需重構業務邏輯
      
    • LIKE前綴匹配:使用 LIKE '張%' 而非 LIKE '%張'
  3. 覆蓋索引優化

    • 當查詢列完全包含在索引中時,可避免回表:
      -- 索引 (a, b, c)
      SELECT a, b FROM t WHERE a = 1 AND b = 2  -- 覆蓋索引,無需回表
      

底層原理說明

MySQL 的 B+ 樹索引按列順序組織數據。復合索引 (a, b, c) 的物理存儲結構如下:

  • 第一層按 a 排序
  • 第二層在相同 a 值下按 b 排序
  • 葉子節點在相同 a, b 值下按 c 排序

因此,只有從最左列開始連續匹配,才能通過索引快速定位數據。


特殊場景說明

  1. 跳過中間列

    -- 索引 (a, b, c)
    WHERE a = 1 AND c = 3  -- 僅a有效,c無法直接利用索引(除非a=1的記錄數極少)
    
  2. 多列等值查詢

    -- 索引 (a, b, c)
    WHERE a = 1 AND b = 2 AND c > 3  -- a,b有效,c范圍查詢
    
  3. ORDER BY 與 WHERE 結合

    -- 索引 (a, b, c)
    SELECT * FROM t WHERE a=1 ORDER BY b, c  -- 有效
    SELECT * FROM t WHERE a=1 ORDER BY c, b  -- 僅a有效,c,b無法利用索引
    

驗證方法

通過 EXPLAIN 命令檢查查詢是否使用索引:

EXPLAIN SELECT * FROM user WHERE name = '張三' AND age = 20;
-- 查看type列為"ref"或"range"且key顯示實際使用的索引

總結

最左前綴匹配原則的本質是 MySQL 復合索引的有序性約束。設計索引時應:

  1. 高頻查詢條件列置于左側
  2. 等值查詢列放在范圍查詢列之前
  3. 避免在索引列上使用函數或計算
  4. 通過 EXPLAIN 驗證索引使用情況

理解并遵循這一原則,可顯著提升查詢性能,避免因索引失效導致的全表掃描。

我正在程序員刷題神器面試鴨上高效準備面試,9000+ 高頻面試真題、800 萬字優質題解,覆蓋主流編程方向,跟我一起刷原題、過面試:點擊進入

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

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

相關文章

SQL命令

一、控制臺中查詢命令 默認端口號&#xff1a;3306 查看服務器版本: mysql –version 啟動MySQL服務&#xff1a;net start mysql 登錄數據庫&#xff1a;mysql -u root -p 查看當前系統下的數據庫&#xff1a;show databases&#xff1b; 創建數據庫&#xff1a;create…

新增 29 個專業,科技成為關鍵賽道!

近日&#xff0c;教育部正式發布《普通高等學校本科專業目錄&#xff08;2025年&#xff09;》&#xff0c;新增 29 個本科專業&#xff0c;包括區域國別學、碳中和科學與工程、海洋科學與技術、健康與醫療保障、智能分子工程、醫療器械與裝備工程、時空信息工程、國際郵輪管理…

零基礎上手Python數據分析 (23):NumPy 數值計算基礎 - 數據分析的加速“引擎”

寫在前面 —— 超越原生 Python 列表,解鎖高性能數值計算,深入理解 Pandas 的底層依賴 在前面一系列關于 Pandas 的學習中,我們已經領略了其在數據處理和分析方面的強大威力。我們學會了使用 DataFrame 和 Series 來高效地操作表格數據。但是,你是否好奇,Pandas 為何能夠…

Android 13.0 MTK Camera2 設置默認拍照尺寸功能實現

Android 13.0 MTK Camera2 設置默認拍照尺寸功能實現 文章目錄 需求&#xff1a;參考資料架構圖了解Camera相關專欄零散知識了解部分相機源碼參考&#xff0c;學習API使用&#xff0c;梳理流程&#xff0c;偏應用層Camera2 系統相關 修改文件-修改方案修改文件&#xff1a;修改…

HarmonyOS 框架基礎知識

參考文檔&#xff1a;HarmonyOS開發者文檔 第三方庫&#xff1a;OpenHarmony三方庫中心倉 基礎特性 Entry&#xff1a;關鍵裝飾器 Components&#xff1a;組件 特性EntryComponent??作用范圍僅用于頁面入口可定義任意可復用組件??數量限制??每個頁面有且僅有一個無數量…

前端分頁與瀑布流最佳實踐筆記 - React Antd 版

前端分頁與瀑布流最佳實踐筆記 - React Antd 版 1. 分頁與瀑布流對比 分頁&#xff08;Pagination&#xff09;瀑布流&#xff08;Infinite Scroll&#xff09;展示方式按頁分批加載&#xff0c;有明確頁碼控件滾動到底部時自動加載更多內容&#xff0c;無明顯分頁用戶控制用…

Linux網絡編程:TCP多進程/多線程并發服務器詳解

Linux網絡編程&#xff1a;TCP多進程/多線程并發服務器詳解 TCP并發服務器概述 在Linux網絡編程中&#xff0c;TCP服務器主要有三種并發模型&#xff1a; 多進程模型&#xff1a;為每個客戶端連接創建新進程多線程模型&#xff1a;為每個客戶端連接創建新線程I/O多路復用&am…

詳解springcloudalibaba采用prometheus+grafana實現服務監控

文章目錄 1.官網下載安裝 prometheus和grafana1.promethus2.grafana 2. 搭建springcloudalibaba集成prometheus、grafana1. 引入依賴,springboot3.2之后引入如下2. 在yml文件配置監控端點暴露配置3. 在當前啟動的應用代碼中添加&#xff0c;在prometheus顯示的時候附加當前應用…

數據分析1

一、常用數據處理模塊Numpy Numpy常用于高性能計算&#xff0c;在機器學習常常作為傳遞數據的容器。提供了兩種基本對象&#xff1a;ndarray、ufunc。 ndarray具有矢量算術運算和復雜廣播能力的快速且節省空間的多維數組。 ufunc提供了對數組快速運算的標準數學函數。 ndar…

DeepSeek智能時空數據分析(六):大模型NL2SQL繪制城市之間連線

序言&#xff1a;時空數據分析很有用&#xff0c;但是GIS/時空數據庫技術門檻太高 時空數據分析在優化業務運營中至關重要&#xff0c;然而&#xff0c;三大挑戰仍制約其發展&#xff1a;技術門檻高&#xff0c;需融合GIS理論、SQL開發與時空數據庫等多領域知識&#xff1b;空…

2023ICPC合肥題解

文章目錄 F. Colorful Balloons(簽到)E. Matrix Distances(思維小結論)J. Takeout Delivering(最短路)G. Streak Manipulation(二分dp)C. Cyclic Substrings(回文自動機) 題目鏈接 F. Colorful Balloons(簽到) int n;cin>>n;for(int i1;i<n;i) cin>>s[i];map<…

數字技術驅動下教育生態重構:從信息化整合到數字化轉型的路徑探究

一、引言 &#xff08;一&#xff09;研究背景與問題提出 在當今時代&#xff0c;數字技術正以前所未有的速度和深度滲透到社會的各個領域&#xff0c;教育領域也不例外。從早期的教育信息化整合到如今的數字化轉型&#xff0c;教育系統正經歷著一場深刻的范式變革。 回顧教…

terraform 動態塊(Dynamic Blocks)詳解與實踐

在 Terraform 中&#xff0c;動態塊&#xff08;Dynamic Blocks&#xff09; 是一種強大的機制&#xff0c;允許你根據變量或表達式動態生成配置塊&#xff0c;避免重復編寫相似的代碼。這在處理需要重復定義的結構&#xff08;如資源參數、嵌套配置&#xff09;時特別有用。以…

Unity3D引擎框架及用戶接口調用方式相關分析及匯總

分析目的 目前外網3D手游絕大部基于Unity3D引擎進行開發,Unity3D引擎屬于商業引擎,引擎整理框架的運行機制較為神秘,本文介紹Unity引擎框架、對象組織方式、用戶接口與引擎交互方式等原理,通過本文的分析和介紹可了解Unity3D框架中大致執行原理。 實現原理 Unity引擎作為…

react-09React生命周期

1.react生命周期&#xff08;舊版&#xff09; 1.1react初始掛載時的生命周期 1:構造器-constructor // 構造器constructor(props) {console.log(1:構造器-constructor);super(props)// 初始化狀態this.state {count: 0}} 2:組件將要掛載-componentWillMount // 組件將要掛載…

【NVM】管理不同版本的node.js

目錄 一、下載nvm 二、安裝nvm 三、驗證安裝 四、配置下載鏡像 五、使用NVM 前言&#xff1a;不同的node.js版本會讓你在使用過程很費勁&#xff0c;nvm是一個node版本管理工具&#xff0c;通過它可以安裝多種node版本并且可以快速、簡單的切換node版本。 一、下載nvm htt…

八大排序——冒泡排序/歸并排序

八大排序——冒泡排序/歸并排序 一、冒泡排序 1.1 冒泡排序 1.2 冒泡排序優化 二、歸并排序 1.1 歸并排序&#xff08;遞歸&#xff09; 1.2 遞歸排序&#xff08;非遞歸&#xff09; 一、冒泡排序 1.1 冒泡排序 比較相鄰的元素。如果第一個比第二個大&#xff0c;就交換…

區塊鏈隨學隨記

前情提要&#xff1a;本人技術棧為ganachehardhatpython ganache提供的是本地的區塊鏈環境&#xff0c;相當于模擬以太坊&#xff0c;這樣可以允許多個賬戶在本機交互。hardhat和remix都是區塊鏈ide&#xff0c;用于編寫和部署合約助記詞有個數規定&#xff0c;只有滿足這些個數…

Android原生開發基礎

Android實戰 Android 原生開發基礎 知識點1 介紹了解2 系統體系架構3 四大應用組件4 移動操作系統優缺點5 開發工具6 配置工具7 下載相關資源8JDK下載安裝流程9配置好SDK和JDK環境10 第一個Hello word11 AS開發前常用設置12模擬器使用運行13 真機調試14 AndroidUI基礎布局15 加…

網頁版 deepseek 對話問答內容導出為 PDF 文件和 Word 文件的瀏覽器插件下載安裝和使用說明

文章目錄 網頁版 deepseek 瀏覽器擴展應用程序插件1. 預覽效果2. 功能介紹3. 瀏覽器擴展應用程序下載3.1. 下載方式13.2. 下載方式24. 安裝教程4.1. Chrome 瀏覽器安裝步驟4.2. Edge 瀏覽器安裝步驟5. 使用說明網頁版 deepseek 瀏覽器擴展應用程序插件 1. 預覽效果 預覽效果 導…