一、MySQL 索引到底是什麼?(大白話解釋)

索引就像書籍的目錄

  • 沒有索引時,MySQL 查數據要逐行掃描整張表(全表掃描),就像找書中某句話要一頁頁翻;
  • 有了索引後,MySQL 先查索引(目錄),快速定位到數據所在的行,直接讀取,效率提升幾十倍甚至上百倍。

從技術角度説,MySQL 索引是一種特殊的數據結構(主流是 B + 樹),存儲了表中一列 / 多列的值和對應數據的物理地址,核心作用是加速查詢。

二、索引的核心作用

  1. 加速查詢:這是最核心的作用,尤其是表數據量上萬、上百萬時,差距極其明顯;
  2. 減少排序 / 分組開銷:索引本身是有序的,查詢需要排序(ORDER BY)、分組(GROUP BY)時,可直接用索引的有序性,無需額外排序;
  3. 唯一性約束:比如主鍵索引(PRIMARY KEY)、唯一索引(UNIQUE),能保證列值不重複,避免數據冗餘。

三、MySQL 常用索引類型(新手必懂)

索引類型

特點 / 用途

示例場景

主鍵索引

唯一、非空,一張表只能有 1 個,默認用 B + 樹實現

用户表的 id 列(user_id)

唯一索引

列值唯一(可含 NULL),一張表可多個

用户表的手機號 / 郵箱列

普通索引

最基礎的索引,無唯一性約束,加速普通查詢

商品表的分類列(category_id)

複合索引

基於多列創建的索引,遵循 “最左前綴匹配” 原則

訂單表的(user_id, create_time)

全文索引

針對文本內容的索引,支持模糊匹配(MATCH AGAINST),適合長文本(如文章)

文章表的 content 列

四、索引的創建與刪除(實操示例)

1. 創建索引

sql

-- 1. 創建普通索引(建表後)
CREATE INDEX idx_goods_category ON goods(category_id);

-- 2. 創建唯一索引
CREATE UNIQUE INDEX idx_user_phone ON user(phone);

-- 3. 創建複合索引
CREATE INDEX idx_order_user_create ON `order`(user_id, create_time);

-- 4. 建表時直接創建索引
CREATE TABLE user (
    id INT PRIMARY KEY AUTO_INCREMENT, -- 主鍵索引(自動創建)
    phone VARCHAR(11) UNIQUE, -- 唯一索引(自動創建)
    name VARCHAR(20),
    INDEX idx_user_name (name) -- 普通索引
);

2. 刪除索引

sql

-- 刪除普通/唯一/複合索引
DROP INDEX idx_goods_category ON goods;

-- 刪除主鍵索引(需先取消自增,再刪除)
ALTER TABLE user MODIFY id INT;
ALTER TABLE user DROP PRIMARY KEY;

五、索引使用的核心規則(避坑關鍵)

  1. 最左前綴匹配原則:複合索引(a,b,c),只有查詢條件包含a(最左列)時才會生效,比如:
  • 生效:WHERE a=1WHERE a=1 AND b=2WHERE a=1 AND b=2 AND c=3
  • 不生效:WHERE b=2WHERE b=2 AND c=3
  1. 這些情況索引會失效
  • 索引列參與函數 / 運算:WHERE id+1=10(應寫成WHERE id=9);
  • 使用模糊查詢前綴 %:WHERE name LIKE '%張三'(後綴 % 生效:WHERE name LIKE '張三%');
  • 使用 OR 連接非索引列:WHERE a=1 OR b=2(b 無索引時失效);
  • 索引列用了 NULL 判斷(儘量給列設默認值)。
  1. 不是索引越多越好:索引會加速查詢,但會減慢插入 / 更新 / 刪除(因為修改數據時要同步更新索引),建議只給常用查詢字段建索引。

六、如何驗證索引是否生效?

EXPLAIN命令分析 SQL 執行計劃:

sql

-- 查看查詢是否使用索引
EXPLAIN SELECT * FROM goods WHERE category_id=1;

重點看type列(越好:const > eq_ref > ref > range > ALL)和key列(顯示使用的索引名,NULL 表示未用索引)。

總結

  1. 核心本質:索引是 MySQL 的 “目錄”,基於 B + 樹實現,核心作用是加速查詢;
  2. 常用類型:主鍵索引、唯一索引、普通索引、複合索引(重點掌握複合索引的最左前綴原則);
  3. 避坑要點:避免索引失效場景,索引不是越多越好,用 EXPLAIN 驗證索引是否生效。