索引是查詢性能的關鍵。MySQL 支援 CREATE INDEX、ALTER TABLE、DROP INDEX 管理索引。本文系統整理創建、刪除、修改索引的語法、類型選擇及最佳實踐。
| 類型 | 關鍵字 | 特點 | 適用場景 |
|---|---|---|---|
| 普通索引 | INDEX | 允許重複、NULL | 查詢條件、排序、分組列 |
| 唯一索引 | UNIQUE | 值唯一、允許 NULL | 業務唯一鍵(郵箱、手機) |
| 主鍵索引 | PRIMARY KEY | 唯一、非 NULL、聚簇索引 | 表標識列 |
| 全文索引 | FULLTEXT | 文本搜尋 | 文章、日志內容搜尋 |
| 空間索引 | SPATIAL | 幾何數據 | GIS 應用 |
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(100) NOT NULL,
name VARCHAR(50),
created_at DATETIME,
UNIQUE INDEX uk_email (email),
INDEX idx_name_created (name, created_at)
) ENGINE=InnoDB;
-- 普通索引
ALTER TABLE users ADD INDEX idx_name (name);
-- 唯一索引
ALTER TABLE users ADD UNIQUE INDEX uk_phone (phone);
-- 主鍵(表無主鍵時)
ALTER TABLE users ADD PRIMARY KEY (id);
-- 聯合索引(順序關鍵:最左前綴原則)
ALTER TABLE orders ADD INDEX idx_uid_status_created (user_id, status, created_at);
CREATE INDEX idx_email ON users (email);
CREATE UNIQUE INDEX uk_username ON users (username);
-- 不支持創建 PRIMARY KEY
-- 通用語法
DROP INDEX idx_name ON users;
ALTER TABLE users DROP INDEX idx_name;
-- 刪除主鍵(無需指定名)
ALTER TABLE users DROP PRIMARY KEY;
ALTER TABLE users DROP INDEX idx_name, ADD INDEX idx_name_status (name, status);
SHOW INDEX FROM users;
-- 或
SELECT * FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA='db' AND TABLE_NAME='users';
(a,b,c) 支援 a、a,b、a,b,c 查詢COUNT(DISTINCT col)/COUNT(*) > 0.1)SELECT 列全在索引中,避免回表ALGORITHM=INPLACE:原地重建,不鎖表(大多數場景)ALGORITHM=COPY:複製表,阻塞寫入(舊版/特定操作)LOCK=NONE/SHARED/EXCLUSIVE/DEFAULT:控制並發pt-online-schema-changeCREATE TABLE orders (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT NOT NULL,
status TINYINT NOT NULL DEFAULT 0,
total_amount DECIMAL(10,2) NOT NULL,
created_at DATETIME NOT NULL,
updated_at DATETIME NOT NULL,
INDEX idx_user_created (user_id, created_at DESC), -- 用戶訂單列表
INDEX idx_status_created (status, created_at), -- 狀態流轉查詢
INDEX idx_updated (updated_at) -- 同步增量
) ENGINE=InnoDB;
索引管理核心:建表時規劃、ALTER TABLE 線上變更、最左前綴設計、覆蓋索引避免回表、定期清理無用索引。使用 EXPLAIN 驗證 key 與 Extra,確保索引生效。