首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 索引優化實戰:類型選擇、創建策略、EXPLAIN 分析與引擎配合

     編輯:MySQL 資料庫相關知識

索引核心價值

索引是提升查詢性能的關鍵。無索引時 MySQL 全表掃描(Type=ALL),建立索引後可將掃描行數從數十萬降至 1,查詢耗時從秒級降至毫秒級。

五大索引類型與創建語法

1. 主鍵索引

CREATE TABLE user(
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(40) NOT NULL,
    PRIMARY KEY (id)
);

特點:唯一、非空、聚簇索引(InnoDB),每表僅一個。

2. 普通索引

CREATE INDEX idx_name ON user(name(20));

特點:無唯一性限制,支持前綴索引(節省空間,如 name(20))。

3. 唯一索引

CREATE UNIQUE INDEX idx_email ON user(email);

特點:值唯一,允許 NULL(多個 NULL 不衝突)。

4. 全文索引

CREATE TABLE articles (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(200),
    body TEXT,
    FULLTEXT (title, body)
) ENGINE=MyISAM;

SELECT * FROM articles WHERE MATCH(title,body) AGAINST('database');

特點:僅 MyISAM 支持(5.6+ InnoDB 也支持),自然語言搜索,返回相關度評分。

5. 復合索引(最左前綴原則)

CREATE TABLE test(
    id INT NOT NULL PRIMARY KEY,
    last_name CHAR(30) NOT NULL,
    first_name CHAR(30) NOT NULL,
    INDEX name (last_name, first_name)
);

生效查詢:

  • WHERE last_name='Widenius' ✓
  • WHERE last_name='Widenius' AND first_name='Michael' ✓
  • WHERE first_name='Michael' ✗(非最左列)

何時創建索引:EXPLAIN 實戰分析

-- 未建索引前
EXPLAIN SELECT name FROM fps WHERE name='李武';
-- type=ALL, rows=1041, Extra=Using where

-- 建立索引
CREATE INDEX idx_name ON fps(name);

-- 建索引後
EXPLAIN SELECT name FROM fps WHERE name='李武';
-- type=ref, rows=1, Extra=Using where; Using index

EXPLAIN 關鍵列解讀

列含義優化目標
type連接類型:system>const>eq_ref>ref>range>index>ALL避免 ALL,達到 ref/range
possible_keys可能用到的索引確保目標索引在列表中
key實際使用的索引非 NULL 表示命中
key_len索引使用長度(字節)驗證復合索引列使用情況
rows預估掃描行數越接近 1 越好
Extra額外信息Using index(覆蓋索引)佳;Using filesort/Using temporary 需優化

存儲引擎與索引的協同

MyISAM

  • .MYD 數據文件、.MYI 索引文件分離
  • 支持數據/索引文件分盤提升 IO
  • 表級鎖,讀多寫少場景優勢大
  • myisamchk 修復、myisampack 壓縮

InnoDB

  • 聚簇索引:主鍵即數據順序,二級索引葉子存主鍵值
  • 行級鎖 + MVCC,高並發寫入優勢
  • 共享表空間或獨立表空間(innodb_file_per_table=1)
  • 崩潰恢復通過 redo/undo log,備份需 xtrabackup 或 mysqldump --single-transaction

引擎選擇指南

場景推薦引擎理由
Web 讀多寫少、全文搜索MyISAM讀性能強、原生全文索引
事務業務、高並發寫入、外鍵InnoDBACID、行級鎖、崩潰恢復
臨時計算、緩存表MEMORY內存級速度

優化檢查清單

  1. WHERE/JOIN/ORDER BY/GROUP BY 涉及的列建立索引
  2. 復合索引遵循最左前綴,區分度高的列靠前
  3. 避免索引列上使用函數/運算(WHERE id+1=5 失效)
  4. 覆蓋索引:SELECT id, name FROM t WHERE email=? 含 INDEX(email, name)
  5. 定期 ANALYZE TABLE 更新統計信息,OPTIMIZE TABLE 整理碎片
  6. 監控 slow_query_log + EXPLAIN 持續優化
未建索引EXPLAIN 建索引後EXPLAIN
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved