四大核心維度帶你系統(tǒng)梳理MySQL索引的分類邏輯
在數(shù)據(jù)庫開發(fā)與優(yōu)化中,MySQL 索引是繞不開的核心話題。很多開發(fā)者面對“慢查詢”束手無策,其實問題根源往往就在于索引沒建對、沒用好。本文將從四大核心維度系統(tǒng)梳理 MySQL 索引的分類邏輯,幫助你快速構(gòu)建清晰認(rèn)知框架,真正做到“知其然,更知其所以然”,讓查詢優(yōu)化少走 90% 的彎路。
一、按功能特性分類(最貼近業(yè)務(wù)開發(fā))
這是開發(fā)者日常接觸最多的分類方式,直接決定你該為哪些字段建哪種索引。
1. 主鍵索引(Primary Key Index)
特點:唯一、非空、每表僅一個;自動創(chuàng)建聚簇索引(InnoDB)。
作用:唯一標(biāo)識每一行記錄。
示例:
CREATE TABLE user ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(50), PRIMARY KEY (id) );
2. 唯一索引(Unique Index)
特點:值唯一(允許多個 NULL),可多個;用于業(yè)務(wù)唯一性約束。
適用場景:手機號、郵箱等需去重但非主鍵的字段。
示例:
CREATE UNIQUE INDEX idx_user_phone ON user(phone);
3. 普通索引(Normal/Index)
特點:無約束,僅加速查詢;最常用。
適用場景:經(jīng)常出現(xiàn)在 WHERE、JOIN、ORDER BY 中的字段。
示例:
CREATE INDEX idx_user_name ON user(name);
4. 全文索引(Full-Text Index)
特點:支持 MATCH ... AGAINST 全文檢索;適用于 CHAR/VARCHAR/TEXT。
注意:LIKE '%關(guān)鍵詞%' 無法使用 B+Tree 索引,此時全文索引是唯一解。
示例:
CREATE FULLTEXT INDEX idx_article_content ON article(content);
5. 組合索引(Composite / 聯(lián)合索引)
特點:多個字段組成一個索引;遵循最左前綴原則。
優(yōu)勢:減少索引數(shù)量,提升多條件查詢效率。
示例:
CREATE INDEX idx_user_age_name ON user(age, name); -- 可加速 WHERE age=25 AND name='張三' -- 也可加速 WHERE age=25(但不能加速僅 WHERE name='張三')
二、按底層數(shù)據(jù)結(jié)構(gòu)分類(決定性能本質(zhì))
索引的本質(zhì)是數(shù)據(jù)結(jié)構(gòu),不同結(jié)構(gòu)適合不同查詢模式。
1. B+Tree 索引(默認(rèn)且最主流)
引擎支持:InnoDB、MyISAM 默認(rèn)使用。
優(yōu)勢:
- 支持范圍查詢(
>,<,BETWEEN) - 支持排序(
ORDER BY) - 磁盤 IO 少,查詢穩(wěn)定高效
適用場景:90% 以上的業(yè)務(wù)查詢。
2. Hash 索引
引擎限制:Memory 引擎原生支持;InnoDB 有自適應(yīng) Hash 索引(不可手動創(chuàng)建)。
優(yōu)勢:等值查詢(=、IN)極快,O(1) 時間復(fù)雜度。
劣勢:
- 不支持范圍、排序、模糊查詢
- 哈希沖突時性能驟降
適用場景:內(nèi)存表中的精確匹配高頻查詢。
3. 空間索引(R-Tree)
- 支持類型:
POINT、LINESTRING、POLYGON等地理數(shù)據(jù)。 - 引擎支持:MyISAM、InnoDB(5.7+)。
- 用途:GIS 應(yīng)用,如“附近 5 公里內(nèi)的商家”。
4. 全文索引(倒排索引結(jié)構(gòu))
- 底層:基于分詞的倒排索引(類似搜索引擎)。
- 注意:與 B+Tree 全文索引不同,需用
MATCH ... AGAINST語法。
三、按物理存儲方式分類(影響 I/O 效率)
1. 聚簇索引(Clustered Index)
- 特點:索引即數(shù)據(jù),葉子節(jié)點直接存儲整行數(shù)據(jù)。
- InnoDB 規(guī)則:主鍵索引 = 聚簇索引;若無主鍵,InnoDB 自動生成隱藏聚簇索引。
- 優(yōu)勢:主鍵查詢只需一次 I/O。
- 注意:一張表只能有一個聚簇索引。
2. 非聚簇索引(Secondary Index / 二級索引)
- 特點:葉子節(jié)點存儲的是主鍵值(InnoDB)或行指針(MyISAM)。
- 查詢過程:先查二級索引 → 再回表查聚簇索引(“回表查詢”)。
- 優(yōu)化建議:盡量使用覆蓋索引(SELECT 字段都在索引中),避免回表。
四、按字段數(shù)量分類(設(shè)計索引時的關(guān)鍵考量)
| 類型 | 說明 | 注意事項 |
|---|---|---|
| 單列索引 | 僅包含一個字段 | 簡單直接,但可能冗余 |
| 組合索引 | 包含 2~16 個字段(InnoDB 最多 16 列) | 遵循最左前綴,合理排序字段順序可大幅提升復(fù)用率 |
最佳實踐:將區(qū)分度高、查詢頻率高的字段放組合索引左側(cè)。
總結(jié):如何科學(xué)建索引?
- 主鍵必設(shè):使用自增整數(shù)主鍵,避免隨機 UUID 導(dǎo)致頁分 裂。
- 高頻查詢字段加普通索引:如狀態(tài)、類型、時間等。
- 唯一性字段用唯一索引:如手機號、訂單號。
- 多條件查詢優(yōu)先考慮組合索引:避免建多個單列索引。
- 警惕索引失效:函數(shù)操作、隱式類型轉(zhuǎn)換、
OR條件不當(dāng)?shù)榷紩?dǎo)致索引失效。 - 定期分析慢查詢?nèi)罩?/strong>:用
EXPLAIN查看執(zhí)行計劃,驗證索引是否生效。
到此這篇關(guān)于四大核心維度帶你系統(tǒng)梳理MySQL索引的分類邏輯的文章就介紹到這了,更多相關(guān)MySQL索引內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SQL?Server數(shù)據(jù)庫創(chuàng)建遠程服務(wù)器備份計劃(SQL Server2016)
最近項目系統(tǒng)做安全加固,以前是本地備份,現(xiàn)在需要做遠程內(nèi)網(wǎng)服務(wù)器數(shù)據(jù)庫備份,后期也有可能做異地備份,下面以SQL Server2016 內(nèi)網(wǎng)服務(wù)器數(shù)據(jù)庫備份為例給大家詳細(xì)講解SQL?Server數(shù)據(jù)庫創(chuàng)建遠程服務(wù)器備份計劃,感興趣的朋友一起看看吧2023-10-10
SQL恢復(fù)master數(shù)據(jù)庫方法 只有mdf文件的數(shù)據(jù)庫如何恢復(fù)
這篇文章主要為大家詳細(xì)介紹了SQL恢復(fù)master數(shù)據(jù)庫方法,還分析了只有mdf文件的數(shù)據(jù)庫如何進行恢復(fù)的情況,也就是沒有l(wèi)og文件的數(shù)據(jù)庫文件恢復(fù)方法,感興趣的小伙伴們可以參考一下2016-05-05
SQL?Server數(shù)據(jù)庫判斷最近一次的備份執(zhí)行結(jié)果(最新推薦)
這篇文章主要介紹了SQL?Server數(shù)據(jù)庫判斷最近一次的備份執(zhí)行結(jié)果,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-05-05
MSSQL 多字段根據(jù)范圍求最大值實現(xiàn)方法
MSSQL 多字段根據(jù)范圍求最大值實現(xiàn)語句,大家可以參考下2009-09-09
oracle忘記sys/system/scott用戶密碼的解決方法
一、忘記除SYS、SYSTEM用戶之外的用戶的登錄密碼。 二、忘記SYS用戶,或者是SYSTEM用戶的密碼。 三、如果SYS,SYSTEM用戶的密碼都忘記或是丟失。 解決方法2013-03-03
一文詳解如何遠程連接SQLServer數(shù)據(jù)庫
sql?server是一款數(shù)據(jù)庫管理工具,其中有非常多實用的功能可以幫助用戶完成數(shù)據(jù)庫的管理操作,也有一些用戶在操作這款軟件的時候會需要用到遠程連接功能,這篇文章主要給大家介紹了關(guān)于如何遠程連接SQLServer數(shù)據(jù)庫的相關(guān)資料,需要的朋友可以參考下2023-10-10
sql 游標(biāo)的使用—游標(biāo)FOR循環(huán)小例子
游標(biāo)for循環(huán)是在pl/sql塊中使用游標(biāo)最簡單的方式,它簡化了對游標(biāo)的處理。當(dāng)使用游標(biāo)for循環(huán)時,oracle會隱含的打開游標(biāo),提取游標(biāo)數(shù)據(jù)并關(guān)閉游標(biāo)。2013-05-05
SQL中的GREATEST函數(shù)從一組數(shù)據(jù)中找出最大值的解決方案
SQL提供了一個強大的函數(shù)——GREATEST,可以輕松實現(xiàn)這一需求,下面詳細(xì)講述一下GREATEST函數(shù)的作用、用法、容易出現(xiàn)的問題以及解決方法,感興趣的朋友跟隨小編一起看看吧2024-06-06

