MySQL 支援多種儲存引擎(表類型),各有優劣。本文系統整理三大經典類型特性、建立/修改/刪除語法、資訊查看工具、隱式列變更規則,並提供選型決策樹與實戰建議。
| 特性 | MyISAM (3.23+ 預設) | ISAM (棄用) | HEAP / MEMORY |
|---|---|---|---|
| 索引結構 | B-Tree | B-Tree | Hash (預設) / B-Tree |
| 資料檔 | .MYD | .ISD | 記憶體 |
| 索引檔 | .MYI | .ISM | 記憶體 |
| 交易支援 | 無 | 無 | 無 |
| 表鎖/行鎖 | 表鎖 | 表鎖 | 表鎖 |
| 全文索引 | 支援 (5.6+) | 無 | 無 |
| 跨平台移植 | 是 | 否 | 否 (重啟失效) |
| 適用場景 | 唯讀/多讀少寫、全文搜尋 | 歷史遺留 | 臨時表、快速查找表 |
現代建議:生產環境首選 InnoDB(交易、行鎖、外鍵、崩潰恢復、聚簇索引),MyISAM 僅用於唯讀分析表或全文索引舊版相容。
CREATE TABLE tbl_name (
col_name type [NOT NULL | NULL] [DEFAULT default_val] [AUTO_INCREMENT] [PRIMARY KEY],
...
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
CREATE TABLE t (id INT) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
VARCHAR(n) n<4 → 自動轉 CHAR(n)CHAR(n>3) 自動轉 VARCHARTIMESTAMP 顯示寬度:奇數→下一偶數,0 或 >14 → 14,範圍 2~14。TIMESTAMP 不接受字面 NULL,設 NULL 實為 CURRENT_TIMESTAMP。DESCRIBE tbl_name 驗證實際類型。-- 複製結構+資料
CREATE TABLE new_tbl SELECT * FROM old_tbl;
-- 僅複製結構
CREATE TABLE new_tbl SELECT * FROM old_tbl WHERE 0;
-- 自定義主鍵+索引並複製資料
CREATE TABLE new_tbl (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
KEY idx_name (name)
) SELECT name, email FROM old_tbl;
優勢:單指令完成結構推導、索引建立、資料填充;錯誤自動回滾刪表。
CREATE TEMPORARY TABLE tmp_tbl SELECT * FROM real_tbl;
-- 修改 tmp_tbl 不影響 real_tbl,連線結束自動銷毀
| 指令 | 用途 | 關鍵輸出 |
|---|---|---|
| SHOW TABLES [FROM db] [LIKE 'pat'] | 列出資料庫所有表 | Tables_in_db |
| SHOW COLUMNS FROM tbl [FROM db] [LIKE 'pat'] | 列結構詳情 | Field, Type, Null, Key, Default, Extra |
| DESCRIBE tbl [col|wild] | 同 SHOW COLUMNS,Oracle 相容 | 同上 |
| SHOW INDEX FROM tbl [FROM db] | 索引詳情 | Key_name, Seq_in_index, Column_name, Cardinality |
| SHOW TABLE STATUS [FROM db] [LIKE 'pat'] | 表統計資訊 | Engine, Rows, Avg_row_length, Data_length, Index_length, Auto_increment |
mysqlshow # 列出所有資料庫
mysqlshow db_name # 列出資料庫所有表
mysqlshow db_name tbl_name # 顯示表結構
mysqlshow -k db_name tbl_name # 顯示索引
-- 新增欄位
ALTER TABLE tbl ADD col_name type [FIRST | AFTER exist_col];
-- 刪除欄位
ALTER TABLE tbl DROP col_name;
-- 修改欄位類型/屬性
ALTER TABLE tbl MODIFY col_name new_type;
ALTER TABLE tbl CHANGE old_col new_col new_type; -- 可同時改名
-- 重命名欄位
ALTER TABLE tbl CHANGE old_col new_col type;
-- 重命名表
ALTER TABLE tbl RENAME new_tbl;
-- 或
RENAME TABLE old_tbl TO new_tbl;
-- 變更儲存引擎
ALTER TABLE tbl ENGINE=InnoDB;
注意:ALTER TABLE 多為複製表重建(5.6+ 部分操作支援 Online DDL),大表操作會鎖表久,建議用 pt-online-schema-change 或 gh-ost。
DROP TABLE [IF EXISTS] tbl_name [, tbl_name2 ...];
-- IF EXISTS 避免不存在報錯
Threads_running。ANALYZE TABLE 更新統計,配合 OPTIMIZE TABLE 整理碎片 (MyISAM/InnoDB 均適用)。