避免「廚房水槽式」設計——把所有可能用到的欄位全塞進表。
反例:商品表存 price、tax、shipping 三個欄位。
正解:只存 price,稅與運費由應用層或視圖即時計算。稅率變動時無需更新百萬筆商品記錄。
擴充彈性:MySQL ALTER TABLE 支援線上加欄位(5.6+ Online DDL),需求變更時再加欄位即可:
ALTER TABLE products ADD COLUMN rank INT;
-- 差
SELECT * FROM products WHERE category_id = 5;
-- 好
SELECT id, name, price, created_at FROM products WHERE category_id = 5;
收益:
不要因「以後可能用到」而預先建立大量欄位。MySQL 支援:
ADD COLUMN、DROP COLUMNMODIFY COLUMNCHANGE COLUMNADD INDEX、DROP INDEX線上 DDL(5.6+)讓大表結構變更不再鎖表阻塞寫入。
WITH (CTE,8.0+) 替代巢狀子查詢,可讀性與優化器統計資訊更優-- 差:依賴欄位順序
string name = reader[1].ToString();
-- 好:依賴欄位名稱
string name = reader["name"].ToString();
理由:
ALTER TABLE、視圖重寫、查詢欄位順序調整皆可能改變位置reader["name"] 精準定位,reader[1] 極難維護長期來看,可維護性 帶來的效能優化空間遠大於早期微調。清晰的 Schema、明確的查詢、穩健的存取方式,才是高效應用的基石。
遵循五大原則,配合持續的 EXPLAIN 分析與慢查詢審查,打造經得起時間考驗的 MySQL 應用。