索引管理是 DBA 日常核心工作。本文彙總 MySQL 索引的建立、重建、查詢、刪除完整語法,並說明主鍵、唯一、普通、複合索引的建立差異。
-- 普通索引
ALTER TABLE `tbl` ADD INDEX `idx_name` (`col1`, `col2`);
-- 唯一索引
ALTER TABLE `tbl` ADD UNIQUE INDEX `uk_name` (`col`);
-- 主鍵索引
ALTER TABLE `tbl` ADD PRIMARY KEY (`id`);
CREATE INDEX `idx_name` ON `tbl` (`col1`, `col2`);
CREATE UNIQUE INDEX `uk_name` ON `tbl` (`col`);
注意:CREATE INDEX 不能建立主鍵。
CREATE TABLE `tbl` (
`id` INT PRIMARY KEY,
`name` VARCHAR(50),
INDEX `idx_name` (`name`),
UNIQUE KEY `uk_email` (`email`)
) ENGINE=InnoDB;
長期運行導致索引碎片,影響效能。
-- 快速重建(僅 MyISAM/InnoDB 支援)
REPAIR TABLE `tbl` QUICK;
-- InnoDB 推薦:重建表(同時整理索引)
ALTER TABLE `tbl` ENGINE=InnoDB;
-- 或
OPTIMIZE TABLE `tbl`;
SHOW INDEX FROM `tbl`\G
-- 重點欄位:
-- Key_name: 索引名
-- Column_name: 索引欄位
-- Seq_in_index: 複合索引順序
-- Cardinality: 基數(區分度參考)
-- Index_type: BTREE / FULLTEXT / HASH
DROP INDEX `idx_name` ON `tbl`;
ALTER TABLE `tbl` DROP INDEX `idx_name`;
ALTER TABLE `tbl` DROP PRIMARY KEY; -- 僅一個主鍵,無需指定名稱
ALTER TABLE `tbl` DROP UNIQUE `uk_name`;
idx_ 普通、uk_ 唯一、pk_ 主鍵。ANALYZE TABLE 更新 Cardinality,讓優化器做正確決策。pt-online-schema-change 或 MySQL 8.0+ INSTANT DDL 避免鎖表。