CHAR(6) 而非 VARCHAR(255)。MEDIUMINT(3 字節)而非 BIGINT(8 字節)。ENUM,內部以整數存儲,比較速度快於字串。NOT NULL DEFAULT '' 或預設值,消除 NULL 判斷開銷。子查詢需建立臨時表,JOIN 直接在索引間穿梭。MySQL 5.6+ 雖優化了子查詢,但複雜場景 JOIN 仍更穩定。
多條件合併查詢時,UNION ALL 避免去重排序,效能遠優於建臨時表再 INSERT。
BEGIN;
INSERT INTO orders ...;
INSERT INTO order_items ...;
COMMIT; -- 若中間失敗,ROLLBACK 回滾
注意:長事務會鎖定資源阻塞並發,控制事務範圍與執行時間。
LOCK TABLES 獨佔模式簡單但並發極差。InnoDB 行鎖粒度細,配合事務隔離等級(READ COMMITTED/REPEATABLE READ)在大多數場景更優。
FOREIGN KEY (customer_id) REFERENCES customers(id) 確保孤兒資料不入庫。但高併發下外鍵檢查有額外開銷,核心交易鏈路可在應用層保證、資料庫層關閉外鍵。
ENUM、SET 類型通常不宜建索引。FULLTEXT,大量資料先載入再建索引最快。| 低效寫法 | 高效寫法 | 原理 |
|---|---|---|
WHERE YEAR(dt) < 2001 | WHERE dt < '2001-01-01' | 函數導致索引失效 |
WHERE amount/7 < 24 | WHERE amount < 24*7 | 運算在常數側,欄位保持原樣 |
WHERE name LIKE 'MySQL%' | WHERE name >= 'MySQL' AND name < 'MySQM' | 範圍查詢可用索引,LIKE 通配符前綴不可用 |