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

