| 維度 | MyISAM | InnoDB |
|---|---|---|
| 事務 | 不支援 | 完整 ACID |
| 鎖機制 | 表級鎖 | 行級鎖 + MVCC |
| 外鍵 | 不支援 | 支援 |
| 崩潰恢復 | 需 REPAIR TABLE | 自動 Redo/Undo Log |
| 聚簇索引 | 無(堆表) | 主鍵即聚簇索引 |
| 全文索引 | 5.6+ 支援 | 5.6+ 支援 |
| 壓縮表 | 支援 myisampack | 不支援(頁壓縮/透明壓縮) |
| 適用場景 | 唯讀、日誌、緩存、報表 | 核心業務、高併發、關鍵數據 |
實測:並發批量 INSERT 達到一定量級時,MyISAM 表極易損壞,需 REPAIR TABLE 甚至數據丟失。核心業務嚴禁使用 MyISAM。
WHERE、JOIN ON、ORDER BY、GROUP BY 後的列才需要索引。SELECT 列只需考慮覆蓋索引。
(user_id, status) ≫ (status, user_id)
-- VARCHAR(100) 實際前 10 字符已區分 99%+
ALTER TABLE articles ADD INDEX idx_title_prefix (title(10));
-- 空間節省 90%,插入更快,緩存更多鍵值
索引 (a, b, c) 等價於擁有:(a)、(a, b)、(a, b, c) 三個索引。
查詢 WHERE a=1 AND c=3 只能用到 (a) 部分,跳過 b 導致 c 失效。
-- 索引 (user_id, status, email)
SELECT user_id, status, email FROM users WHERE user_id = 100;
-- Extra: Using index(零回表)
sys.schema_unused_indexes、pt-index-usage| 方案 | 量級 | 相對速度 | 關鍵優化 |
|---|---|---|---|
| 單條 INSERT 循環 | < 1K | 1x (基準) | 無 |
| 多值 INSERT (500-1000 行/批) | 1K-100K | 10-50x | 手動事務、關閉唯一/外鍵檢查 |
| LOAD DATA INFILE | > 100K | 100-1000x | 無索引導入→建索引、調大 buffer_pool、flush_log=2 |
| 分區表 + 並行導入 | > 10M | 線性擴展 | 應用層分片協調、獨立分區並行 |
-- 1. 目標表暫時無索引(或用 MyISAM)
CREATE TABLE users_staging LIKE users;
ALTER TABLE users_staging ENGINE=MyISAM; -- 或 InnoDB 但無輔助索引
-- 2. 關閉檢查,調大緩衝
SET SESSION unique_checks=0, foreign_key_checks=0;
SET GLOBAL innodb_buffer_pool_size=4G; -- 視機器調整
SET GLOBAL innodb_flush_log_at_trx_commit=2;
-- 3. 高速導入
LOAD DATA INFILE '/data/users.csv'
INTO TABLE users_staging
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(id, username, email, @created_at)
SET created_at = STR_TO_DATE(@created_at, '%Y-%m-%d %H:%i:%s');
-- 4. 建索引、切換表
ALTER TABLE users_staging ADD PRIMARY KEY (id), ADD INDEX idx_email (email);
RENAME TABLE users TO users_old, users_staging TO users;
DROP TABLE users_old;
mysql> SHOW INDEX FROM user;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| user | 0 | PRIMARY | 1 | user_id | A | 2 | NULL | NULL | | BTREE | |
| user | 1 | user | 1 | username | A | NULL | NULL | NULL | | BTREE | |
| user | 1 | user | 2 | `order` | A | NULL | NULL | NULL | | BTREE | |
| user | 1 | user | 3 | email | A | NULL | NULL | NULL | YES | BTREE | |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
解讀:
PRIMARY:聚簇索引,user_id 遞增,Cardinality=2(樣本統計)user:聯合索引 (username, `order`, email),Seq_in_index 1/2/3 體現最左前綴Sub_part=NULL:全列索引,非前綴索引Null=YES:email 允許 NULLENGINE=InnoDB,主鍵 BIGINT UNSIGNED AUTO_INCREMENTEXPLAIN 核心查詢,消除 type=ALL、Using filesortANALYZE TABLE、清理未用索引、慢查詢分析