一、MySQL 索引到底是什麼?(大白話解釋)
- 沒有索引時,MySQL 查數據要逐行掃描整張表(全表掃描),就像找書中某句話要一頁頁翻;
- 有了索引後,MySQL 先查索引(目錄),快速定位到數據所在的行,直接讀取,效率提升幾十倍甚至上百倍。
二、索引的核心作用
三、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;
五、索引使用的核心規則(避坑關鍵)
- 生效:
WHERE a=1、WHERE a=1 AND b=2、WHERE a=1 AND b=2 AND c=3; - 不生效:
WHERE b=2、WHERE b=2 AND c=3。
- 索引列參與函數 / 運算:
WHERE id+1=10(應寫成WHERE id=9); - 使用模糊查詢前綴 %:
WHERE name LIKE '%張三'(後綴 % 生效:WHERE name LIKE '張三%'); - 使用 OR 連接非索引列:
WHERE a=1 OR b=2(b 無索引時失效); - 索引列用了 NULL 判斷(儘量給列設默認值)。
六、如何驗證索引是否生效?
sql
-- 查看查詢是否使用索引
EXPLAIN SELECT * FROM goods WHERE category_id=1;