MySQL 的索引類型有哪些?

MySQL 中的索引是提高查詢性能的重要工具,它通過構建數據結構來加速數據檢索。MySQL 支持多種索引類型,每種類型適用于不同的場景。以下是 MySQL 中主要的索引類型及其特點:


1. B-Tree 索引(默認類型)

  • 結構:基于平衡多路搜索樹(B-Tree),適用于等值查詢(=)、范圍查詢(><BETWEEN)、排序(ORDER BY)和分組(GROUP BY)。
  • 特點
    • 葉子節點存儲數據或主鍵值(InnoDB 的聚簇索引直接存儲數據,非聚簇索引存儲主鍵值)。
    • 支持前綴匹配(如 LIKE 'abc%'),但 LIKE '%abc' 無法利用索引。
    • 適用于多列組合索引(遵循最左前綴原則)。
  • 適用場景:全值匹配、范圍查詢、排序、分組。
  • 示例
    CREATE INDEX idx_name ON users(name);  -- 單列索引
    CREATE INDEX idx_name_age ON users(name, age);  -- 組合索引
    

2. Hash 索引

  • 結構:基于哈希表,僅支持等值查詢(=IN),不支持范圍查詢或排序。
  • 特點
    • 查詢效率高(O(1) 時間復雜度),但僅適用于內存表(如 MEMORY 引擎)或特定場景(如 InnoDB 的自適應哈希索引)。
    • 無法避免全表掃描(哈希沖突時需遍歷鏈表)。
  • 適用場景:等值查詢(如緩存場景)。
  • 示例
    CREATE TABLE hash_table (id INT,name VARCHAR(100),INDEX USING HASH (name)  -- MEMORY 引擎支持
    ) ENGINE=MEMORY;
    

3. Full-Text 索引(全文索引)

  • 結構:專為文本搜索設計,支持對 CHARVARCHARTEXT 列進行全文檢索。
  • 特點
    • 使用倒排索引技術,支持自然語言搜索(MATCH ... AGAINST)、布爾模式搜索等。
    • 僅適用于 MyISAMInnoDB(MySQL 5.6+)。
  • 適用場景:文本內容搜索(如博客文章、商品描述)。
  • 示例
    CREATE FULLTEXT INDEX idx_content ON articles(content);
    SELECT * FROM articles WHERE MATCH(content) AGAINST('MySQL 索引');
    

4. R-Tree 索引(空間索引)

  • 結構:基于多維空間數據(如地理坐標),支持空間數據查詢(如 MBRContainsST_Distance)。
  • 特點
    • 僅適用于 MyISAMInnoDB(MySQL 5.7+)。
    • 用于地理信息系統(GIS)或空間數據分析。
  • 適用場景:地理位置查詢(如附近商家、區域范圍搜索)。
  • 示例
    CREATE SPATIAL INDEX idx_location ON stores(location);  -- location 為 GEOMETRY 類型
    SELECT * FROM stores WHERE MBRContains(GeomFromText('POLYGON(...)'), location);
    

5. 前綴索引(Partial Index)

  • 結構:對字符串列的前 N 個字符創建索引,節省存儲空間。
  • 特點
    • 適用于長字符串(如 URL、郵箱),但可能降低選擇性(重復值增多)。
    • 需合理選擇前綴長度(通過 COUNT(DISTINCT LEFT(col, N)) 評估)。
  • 適用場景:長字符串列的等值查詢。
  • 示例
    CREATE INDEX idx_email_prefix ON users(email(10));  -- 對 email 前 10 個字符建索引
    

6. 唯一索引(Unique Index)

  • 結構:強制列值唯一(允許 NULL,但 NULL 值不重復)。
  • 特點
    • 保證數據唯一性,同時可作為普通索引加速查詢。
    • 適用于主鍵(PRIMARY KEY)或唯一約束(UNIQUE KEY)。
  • 適用場景:需要唯一性的字段(如用戶名、身份證號)。
  • 示例
    CREATE UNIQUE INDEX idx_username ON users(username);
    -- 或直接定義唯一約束
    ALTER TABLE users ADD CONSTRAINT uk_email UNIQUE (email);
    

7. 主鍵索引(Primary Key Index)

  • 結構:特殊的唯一索引,不允許 NULL 值,且每張表只能有一個。
  • 特點
    • 在 InnoDB 中,主鍵索引是聚簇索引(數據按主鍵順序存儲)。
    • 用于標識行數據,是表的核心索引。
  • 適用場景:表的唯一標識符(如自增 ID、UUID)。
  • 示例
    CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100)
    );
    

8. 復合索引(Multi-Column Index)

  • 結構:在多列上創建的索引,遵循最左前綴原則。
  • 特點
    • 查詢需從索引的最左列開始匹配(如 (a,b,c) 索引可加速 aa,ba,b,c 的查詢)。
    • 避免“索引失效”問題(如跳過最左列或使用范圍查詢后無法利用后續列)。
  • 適用場景:多列聯合查詢(如姓名+年齡篩選)。
  • 示例
    CREATE INDEX idx_name_age ON users(name, age);
    -- 有效查詢:
    SELECT * FROM users WHERE name = 'Alice' AND age = 25;
    -- 無效查詢(跳過最左列):
    SELECT * FROM users WHERE age = 25;
    

9. 自適應哈希索引(Adaptive Hash Index, AHI)

  • 結構:InnoDB 自動為頻繁訪問的索引頁構建哈希索引,無需手動創建。
  • 特點
    • 僅在內存中維護,適用于等值查詢(如 =IN)。
    • 無法手動控制,由 InnoDB 引擎自動管理。
  • 適用場景:高并發等值查詢的熱點數據。

10. 函數索引(虛擬列索引)

  • 結構:對計算列(如 LOWER(name))創建索引,避免在查詢中重復計算。
  • 特點
    • 需 MySQL 5.7+ 或 MariaDB 支持。
    • 適用于表達式查詢(如不區分大小寫的搜索)。
  • 示例
    ALTER TABLE users ADD COLUMN name_lower VARCHAR(100) AS (LOWER(name)) STORED;
    CREATE INDEX idx_name_lower ON users(name_lower);
    SELECT * FROM users WHERE name_lower = 'alice';
    

索引選擇建議

  1. 優先選擇 B-Tree 索引:適用于大多數場景(等值、范圍、排序)。
  2. 避免過度索引:每個索引會增加寫入開銷(INSERT/UPDATE/DELETE)。
  3. 利用最左前綴原則:設計復合索引時,將高選擇性列放在左側。
  4. 監控索引使用情況:通過 EXPLAIN 分析查詢計劃,刪除未使用的索引。

總結

索引類型適用場景引擎支持示例
B-Tree全值、范圍、排序、分組MyISAM、InnoDBCREATE INDEX idx ON t(col);
Hash等值查詢(內存表)MEMORY、InnoDB(AHI)INDEX USING HASH (col)
Full-Text文本搜索MyISAM、InnoDBCREATE FULLTEXT INDEX ...
R-Tree空間數據查詢MyISAM、InnoDBCREATE SPATIAL INDEX ...
前綴索引長字符串列的等值查詢MyISAM、InnoDBINDEX (col(10))
唯一索引唯一性約束所有引擎CREATE UNIQUE INDEX ...
主鍵索引表的唯一標識符所有引擎PRIMARY KEY (col)
復合索引多列聯合查詢MyISAM、InnoDBINDEX (a, b, c)

根據實際查詢需求選擇合適的索引類型,并通過 EXPLAIN 驗證優化效果。

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

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

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

相關文章

基于Qt5的藍牙打印開發實戰:從掃描到小票打印的全流程

文章目錄 前言一、應用案例演示二、開發環境搭建2.1 硬件準備2.2 軟件配置 三、藍牙通信原理剖析3.1 實現原理3.2 通信流程3.3 流程詳解3.4 關鍵技術點 四、Qt藍牙核心類深度解析4.1 QBluetoothDeviceDiscoveryAgent4.2 QBluetoothDeviceInfo4.3 QBluetoothSocket 五、功能實現…

高可靠性厚銅板制造的關鍵設備與工藝投入

隨著科技的不斷發展&#xff0c;電子設備越來越普及&#xff0c;對電路板的需求也越來越大。厚銅板電路板作為一種高性能、高可靠性的電路板&#xff0c;受到了廣泛的關注和應用。那么&#xff0c;作為一家厚銅板電路板供應商&#xff0c;如何投入線路板生產呢&#xff1f;本文…

【如何使用solidwork編輯結構導入到simscope】

這里寫自定義目錄標題 嘗試將solidrwork的模型導入到matlab中&#xff0c;以下是官方給出的設計步驟&#xff0c;沖啊 To use Simscape Multibody Link, you must install MATLAB and the CAD applications on the same computer. To ensure the successful installation of Si…

Linux 在個人家目錄下添加環境變量 如FLINK_PROPERTIES=“jobmanager.rpc.address: jobmanager“

問題&#xff1a; Docker Flink Application Mode 命令行形式部署前&#xff0c;需要在Linux執行以下&#xff1a; $ FLINK_PROPERTIES"jobmanager.rpc.address: jobmanager" $ docker network create flink-network 臨時變量只在當前session會話窗口生效&#xf…

spring項目rabbitmq es項目啟動命令

應該很多開發者遇到過需要啟動中間件的情況&#xff0c;什么測試服務器掛了&#xff0c;服務連不上nacos了巴拉巴拉的&#xff0c;雖然是測試環境&#xff0c;但也會手忙腳亂&#xff0c;瘋狂百度。 這里介紹一些實用方法 有各種不同的場景&#xff0c;一是重啟&#xff0c;服…

語音合成之七語音克隆技術突破:從VALL-E到SparkTTS,如何解決音色保真與清晰度的矛盾?

從VALL-E到SparkTTS&#xff0c;如何解決音色保真與清晰度的矛盾&#xff1f; 引言語音克隆技術發展史YourTTS&#xff1a;深入剖析架構與技術VALL-E&#xff1a;揭秘神經編解碼語言模型MaskGCTSparkTTS&#xff1a;利用 LLM 實現高效且可控的語音合成特征解耦生成式模型特征解…

run code執行ts配置

1、全局安裝typescript npm install –g typescript 執行tsc –v&#xff0c;可輸出版本號&#xff0c;代表安裝成功 2、創建tsConfig文件 npx tsc –init 創建成功目錄下會出現tsconfig.json文件 3、安裝ts-node&#xff0c;支持執行運行ts文件 npm install –g ts-node 控制…

splitchunk(如何將指定文件從主包拆分為單獨的js文件)

1. 說明 webpack打包會默認將入口文件引入依賴js打包為一個入口文件&#xff0c;導致這個文件會比較大&#xff0c;頁面首次加載時造成加載時間較長 可通過splitchunk配置相應的規則&#xff0c;對匹配的規則打包為單獨的js,減小入口js的體積 2. 示例 通過正則匹配&#xff…

postgres 導出導入(基于數據庫,模式,表)

在 PostgreSQL 中&#xff0c;導出和導入數據庫、模式&#xff08;schema&#xff09;或表的數據可以使用多種工具和方法。以下是常用的命令和步驟&#xff0c;分別介紹如何導出和導入整個數據庫、特定的模式以及單個表的數據。 一、導出數據 1. 使用 pg_dump 導出整個數據庫…

第十一天 主菜單/設置界面 過場動畫(Timeline) 成就系統(Steam/本地) 多語言支持

前言 對于剛接觸Unity的新手開發者來說&#xff0c;構建完整的游戲系統往往充滿挑戰。本文將手把手教你實現游戲開發中最常見的四大核心系統&#xff1a;主菜單界面、過場動畫、成就系統和多語言支持。每個模塊都將結合完整代碼示例&#xff0c;使用Unity 2022 LTS版本進行演示…

深入探索Python Pandas:解鎖數據分析的無限可能

放在前頭 深入探索Python Pandas&#xff1a;解鎖數據分析的無限可能 深入探索Python Pandas&#xff1a;解鎖數據分析的無限可能 在當今數據驅動的時代&#xff0c;高效且準確地處理和分析數據成為了各個領域的關鍵需求。而Python作為一門強大且靈活的編程語言&#xff0c;…

小集合 VS 大集合:MySQL 去重計數性能優化

小集合 VS 大集合&#xff1a;MySQL 去重計數性能優化 前言一、場景與問題 &#x1f50e;二、通俗執行流程對比三、MySQL 執行計劃解析 &#x1f4ca;四、性能瓶頸深度剖析 &#x1f50d;五、終極優化方案 &#x1f3c6;六、總結 前言 &#x1f4c8; 測試結果&#xff1a; 在…

3、Linux操作系統下,linux的技術手冊使用(man)

linux系統內置技術手冊&#xff0c;方便開發人員查閱Linux相關指令&#xff0c;提升開發效率 man即是manual的前三個字母&#xff0c;有時候遇事不決&#xff0c;問個人&#xff08;man&#xff09; 其在線網址為&#xff1a;man 還有man網站的作者寫的書&#xff0c;可以下…

京東商品詳情數據爬取難度分析與解決方案

在當今數字化商業時代&#xff0c;電商數據對于市場分析、競品研究、價格監控等諸多領域有著不可估量的價值。京東&#xff0c;作為國內首屈一指的電商巨頭&#xff0c;其商品詳情頁蘊含著海量且極具價值的數據&#xff0c;涵蓋商品價格、庫存、規格、用戶評價等關鍵信息。然而…

正確應對監管部門的數據安全審查

首席數據官高鵬律師團隊編著 在當今數字化時代&#xff0c;數據安全已成為企業及各類組織面臨的重要議題&#xff0c;而監管部門的數據安全審查更是關乎其生存與發展的關鍵挑戰。隨著法律法規的不斷完善與監管力度的加強&#xff0c;如何妥善應對這一審查&#xff0c;避免潛在…

三星One UI安全漏洞:剪貼板數據明文存儲且永不過期

三星One UI系統曝出重大安全漏洞&#xff0c;通過剪貼板功能導致數百萬用戶的敏感信息面臨泄露風險。 剪貼板數據永久存儲 安全研究人員發現&#xff0c;運行Android 9及以上系統的三星設備會將所有剪貼板內容——包括密碼、銀行賬戶詳情和個人消息——以明文形式永久存儲&am…

動態規劃求解leetcode300.最長遞增子序列(LIS)詳解

給你一個整數數組 nums &#xff0c;找到其中最長嚴格遞增子序列的長度。 子序列 是由數組派生而來的序列&#xff0c;刪除&#xff08;或不刪除&#xff09;數組中的元素而不改變其余元素的順序。例如&#xff0c;[3,6,2,7] 是數組 [0,3,1,6,2,2,7] 的子序列。 示例 1&#…

Rule.resourceQuery(通過路徑參數指定loader匹配規則)

1. 說明 在 webpack 4 中&#xff0c;Rule.resourceQuery 是一個用于根據文件路徑中的 查詢參數&#xff08;query string&#xff09; 來匹配資源的配置項。它允許你針對帶有特定查詢條件的文件&#xff08;如 file.css?inline 或 image.png?raw&#xff09;應用不同的加載…

快速上手 MetaGPT

1. MetaGPT 簡介 在當下的大模型應用開發領域&#xff0c;Agent 無疑是最炙手可熱的方向&#xff0c;這也直接催生出了眾多的 Agent 開發框架。在這之中&#xff0c; MetaGPT 是成熟度最高、使用最廣泛的開發框架之一。 MetaGPT 是一款備受矚目的多智能體開發框架&#xff0c…

新聞數據接口開發指南:從多源聚合到NLP摘要生成

隨著人工智能&#xff08;AI&#xff09;技術的飛速發展&#xff0c;新聞行業也迎來了新的變革。AI不僅能夠自動化生成新聞內容&#xff0c;還能通過智能推薦系統為用戶提供個性化的新聞體驗。萬維易源提供的“新聞查詢”API接口&#xff0c;結合了最新的AI技術&#xff0c;為開…