MySQL有5種索引類型及其特點詳解
前言
MySQL(尤其是 InnoDB 引擎)支持多種索引類型,不同索引適用于不同場景。以下是 MySQL 中常見的索引類型及其特點,按邏輯分類和物理結構兩個維度說明:
一、按邏輯用途分類(常用)
1.主鍵索引(Primary Key)
- 唯一且非空,一張表只能有一個。
- InnoDB 中,主鍵索引就是 聚簇索引(Clustered Index):數(shù)據(jù)行與索引存儲在一起。
- 選擇原則:盡量使用自增整數(shù)(避免頁分裂),避免使用 UUID(隨機寫性能差)。
2.唯一索引(Unique Index)
- 索引列的值必須唯一,但允許有
NULL(多個 NULL 不沖突)。 - 適用于:手機號、訂單號、用戶 ID 等業(yè)務唯一字段。
- 創(chuàng)建方式:
CREATE UNIQUE INDEX idx_user_phone ON users(phone);
3.普通索引(Secondary Index / Normal Index)
- 最基礎的索引類型,允許重復值、允許 NULL。
- 用于加速
WHERE、JOIN、ORDER BY等查詢。 - 示例:
CREATE INDEX idx_order_status ON orders(status);
4.組合索引(Composite Index / 聯(lián)合索引)
- 對多個列創(chuàng)建一個索引,如
(col1, col2, col3)。 - 遵循 最左前綴原則(Leftmost Prefix Rule):
- 查詢條件必須從最左列開始,才能命中索引。
- 例如:索引
(a, b, c)可用于WHERE a=1、WHERE a=1 AND b=2,但不能用于WHERE b=2。
- 建議:把區(qū)分度高(選擇性好)的列放前面。
5.前綴索引(Prefix Index)
- 對長字符串字段(如
VARCHAR(255))只索引前 N 個字符。 - 減少索引大小,提升性能。
- 示例:
CREATE INDEX idx_email_prefix ON users(email(20)); -- 只索引前20字符
- ?? 注意:前綴長度需通過
SELECT COUNT(DISTINCT LEFT(email, N)) / COUNT(*)估算區(qū)分度。
二、按物理結構分類(InnoDB)
1.聚簇索引(Clustered Index)
- 數(shù)據(jù)即索引:葉子節(jié)點存儲完整的數(shù)據(jù)行。
- InnoDB 自動使用主鍵作為聚簇索引;若無主鍵,則選擇第一個唯一非空索引;否則用隱藏的
row_id。 - 優(yōu)點:主鍵查詢極快(一次 I/O)。
- 缺點:二級索引需“回表”(先查二級索引 → 再查聚簇索引)。
2.二級索引(Secondary Index)
- 葉子節(jié)點存儲的是主鍵值,不是完整數(shù)據(jù)。
- 查詢流程:二級索引 → 主鍵值 → 聚簇索引 → 獲取數(shù)據(jù)(回表)。
- 優(yōu)化回表:使用 覆蓋索引(Covering Index),即查詢字段全部包含在索引中,無需回表。
三、特殊索引類型(特定場景)
1.全文索引(Full-Text Index)
- 用于
TEXT或VARCHAR字段的全文搜索(如文章內容搜索)。 - 支持
MATCH() AGAINST語法。 - InnoDB 從 MySQL 5.6 開始支持。
- 示例:
CREATE FULLTEXT INDEX idx_content ON articles(content); SELECT * FROM articles WHERE MATCH(content) AGAINST('數(shù)據(jù)庫'); - ?? 不適用于電商商品名等短文本(用 ES 更合適)。
2.空間索引(SPATIAL Index)
- 用于
GEOMETRY類型字段(如地圖坐標、區(qū)域)。 - 僅 MyISAM 和 InnoDB(MySQL 5.7+)支持。
- 使用
R-TREE結構,支持ST_Contains()等空間函數(shù)。
四、不推薦或已廢棄的索引
| 索引類型 | 說明 |
|---|---|
| HASH 索引 | Memory 引擎支持,InnoDB 不支持(但自適應哈希索引 AHI 是內部優(yōu)化) |
| RTREE 索引 | 舊版 MyISAM 用,現(xiàn)已被 SPATIAL 取代 |
?? InnoDB 的 自適應哈希索引(Adaptive Hash Index, AHI) 是 InnoDB 自動為熱點索引頁構建的內存哈希結構,無需手動創(chuàng)建,可通過
SHOW ENGINE INNODB STATUS查看。
五、索引設計黃金法則(電商場景重點)
- 主鍵自增:避免 UUID 導致聚簇索引頻繁頁分裂。
- 組合索引合理排序:高頻過濾字段放前,范圍查詢字段放后(如
(user_id, create_time))。 - 避免冗余索引:
(a,b)和(a)同時存在是冗余的。 - 大字段慎建索引:如
description字段,優(yōu)先考慮前綴索引或異構存儲(如 Elasticsearch)。 - 監(jiān)控慢查詢:用
EXPLAIN分析是否命中索引,關注type(最好ref/range,避免ALL)。
六、查看索引命令
-- 查看表索引 SHOW INDEX FROM table_name; -- 查看執(zhí)行計劃 EXPLAIN SELECT * FROM orders WHERE user_id = 100; -- 查看索引使用統(tǒng)計(MySQL 8.0+) SELECT * FROM performance_schema.table_io_waits_summary_by_index_usage WHERE object_schema = 'your_db' AND object_name = 'your_table';
? 總結:
在電商開發(fā)中,主鍵索引 + 唯一索引 + 合理的組合索引 足以覆蓋 95% 場景。
牢記:索引不是越多越好,而是越精準越好。
到此這篇關于MySQL有5種索引類型及其特點的文章就介紹到這了,更多相關MySQL索引類型內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
用MySQL創(chuàng)建數(shù)據(jù)庫和數(shù)據(jù)庫表代碼
了解了一些最基本的操作命令后,我們再來學習如何創(chuàng)建一個數(shù)據(jù)庫和數(shù)據(jù)庫表。2008-10-10
MySQL觸發(fā)器自動智能化的數(shù)據(jù)維護
這篇文章主要介紹了MySQL觸發(fā)器自動智能化的數(shù)據(jù)維護,觸發(fā)器,就是一種特殊的存儲過程。觸發(fā)器和存儲過程一樣是一個能夠完成特定功能、存儲在數(shù)據(jù)庫服務器上的SQL片段2022-07-07
Windows環(huán)境下MySQL主從復制搭建全步驟(超詳細實操版)
MySQL支持主數(shù)據(jù)庫與從數(shù)據(jù)配置,采用此配置的數(shù)據(jù)庫,MySQL會自動將主數(shù)據(jù)庫中的數(shù)據(jù)同步到從數(shù)據(jù)庫中,這篇文章主要介紹了Windows環(huán)境下MySQL主從復制搭建詳細實操的相關資料,需要的朋友可以參考下2026-02-02
MySQL8.0.21安裝步驟及出現(xiàn)問題解決方案
這篇文章主要介紹了MySQL8.0.21安裝步驟及出現(xiàn)問題解決方案,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12

