首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 索引入門完全指南:類型、操作、最左前綴、失效場景與執行計劃分析

     編輯:MySQL 綜合教學

MySQL 索引入門完全指南:類型、操作、最左前綴、失效場景與執行計劃分析

索引是資料庫查詢效能的關鍵。本文系統講解四大索引類型、DDL 操作、組合索引最左前綴原則、8 大常見失效場景、EXPLAIN 執行計劃欄位解讀,並附分頁優化實戰技巧。

一、四大索引類型

類型關鍵字特點適用場景
普通索引INDEX / KEY僅加速查詢,允許重複值、NULL一般查詢加速
唯一索引UNIQUE INDEX值唯一,允許一個 NULL業務鍵(郵箱、手機、身分證)
主鍵索引PRIMARY KEY唯一、非 NULL、聚簇索引(InnoDB)每張表必須有,建議自增整數
組合索引INDEX (a,b,c)多欄位組合,遵循最左前綴多條件聯合查詢

二、索引 DDL 操作速查

-- 建表時建立
CREATE TABLE t1 (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(32),
  email VARCHAR(64),
  extra TEXT,
  INDEX idx_name (name),
  UNIQUE INDEX uk_email (email),
  INDEX idx_name_email (name, email)
);

-- 事後新增
CREATE INDEX idx_extra ON t1(extra(20));  -- TEXT/BLOB 必須指定前綴長度
CREATE UNIQUE INDEX uk_phone ON t1(phone);
ALTER TABLE t1 ADD PRIMARY KEY (id);      -- 若無主鍵
ALTER TABLE t1 ADD INDEX idx_multi (a,b,c);

-- 刪除
DROP INDEX idx_name ON t1;
DROP PRIMARY KEY ON t1;  -- 先移除 AUTO_INCREMENT

-- 查看
SHOW INDEX FROM t1;
-- 或
SELECT * FROM information_schema.STATISTICS WHERE TABLE_NAME='t1';

三、組合索引最左前綴原則

索引 INDEX (name, email, age):

查詢條件是否走索引說明
WHERE name='A' AND email='B' AND age=20✅完整匹配
WHERE name='A' AND email='B'✅最左前綴
WHERE name='A'✅最左單列
WHERE email='B'❌非最左列
WHERE email='B' AND age=20❌缺少最左列
WHERE name='A' AND age=20⚠️ 部分僅用到 name,age 無法用索引

四、8 大索引失效場景(必背)

  1. 模糊查詢左側通配:LIKE '%abc'、LIKE '%abc%' → 全表掃描。LIKE 'abc%' 可用索引。
  2. 欄位做函數/運算:WHERE YEAR(dt) = 2023、WHERE id + 1 = 100 → 索引失效。
  3. 隱式類型轉換:字串欄位 WHERE name = 123(未加引號) → 索引失效。
  4. OR 條件兩側索引不全:WHERE a=1 OR b=2,若 b 無索引 → 全表掃描。解決:UNION ALL 拆分。
  5. != / <> / NOT IN / IS NULL:通常全表掃描(主鍵例外)。
  6. 範圍查詢後的列無法用索引:INDEX (a,b,c),WHERE a=1 AND b>2 AND c=3 → c 用不到索引。
  7. ORDER BY 非索引列 / 混合 ASC/DESC:SELECT * FROM t ORDER BY name DESC 若 name 無索引 → Using filesort。
  8. 覆蓋索引未包含 SELECT 列:需回表,若回表行數大優化器可能放棄索引。

五、EXPLAIN 執行計劃核心欄位解讀

欄位關鍵值含義
id數字查詢順序,越大越先執行;相同則從上往下
select_typeSIMPLE/PRIMARY/SUBQUERY/DERIVED/UNION查詢類型
table表名/衍生表訪問的表
typesystem/const > eq_ref > ref > range > index > ALL訪問類型,由好到壞。目標至少 ref,避免 ALL
possible_keys索引名列表理論可用索引
key索引名實際使用索引
key_len位元組使用的索引長度,推斷組合索引用了幾列
ref常數/欄位與索引比較的值
rows數字預估掃描行數(越小越好)
ExtraUsing index/Using where/Using filesort/Using temporary關鍵提示:Using index=覆蓋索引;Using filesort=需優化排序

六、大偏移分頁優化實戰

場景:SELECT * FROM t ORDER BY id LIMIT 100000, 20 掃描 10 萬行再丟棄,極慢。

方案:延遲關聯

-- 1. 覆蓋索引快速定位主鍵
SELECT id FROM t ORDER BY id LIMIT 100000, 20;

-- 2. 回表查完整欄位
SELECT t.* FROM t
INNER JOIN (SELECT id FROM t ORDER BY id LIMIT 100000, 20) AS tmp USING (id);

或遊標分頁(需應用層記住上頁最大 ID):

SELECT * FROM t WHERE id > 100000 ORDER BY id LIMIT 20;

總結:索引是空間換時間的藝術。掌握「類型選對、最左前綴、避開失效、讀懂 EXPLAIN、分頁用遊標」五項核心技能,即可應對 80% 以上索引相關效能問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved