資料庫是 Web 應用基石,MySQL 在 LAMP 棧中佔核心地位。PHP 入門易、精通難,許多開發者能快速寫出功能代碼,卻在資料庫設計、安全、效能上埋下隱患。本文梳理 11 大高頻錯誤,附帶修正方案與現代最佳實踐。
錯誤: MySQL 預設引擎曾為 MyISAM,不支援交易、外鍵、行鎖,寫入時全表鎖定,高並發效能極差。
正解: 預設改用 InnoDB(5.5+ 已為預設)。支援 ACID、行鎖、外鍵、MVCC,唯一例外:純讀取、無交易需求的日誌/快取表可考慮 MyISAM/Memory。
錯誤: mysql_connect、mysql_query、mysql_fetch_assoc 等在 PHP 5.5 棄用、7.0 移除。
正解: 改用 MySQLi(面向物件/程序雙介面) 或 PDO(資料庫抽象層)。
優勢:預處理語句防注入、支援交易、多資料庫驅動、效能更優。
// MySQLi 範例
$mysqli = new mysqli('localhost', 'user', 'pass', 'db');
$stmt = $mysqli->prepare('SELECT * FROM users WHERE email = ?');
$stmt->bind_param('s', $email);
$stmt->execute();
錯誤: 直接拼接 $_POST 變數進 SQL。
攻擊例: username = "admin' --" 繞過密碼驗證。
正解: 永不信任輸入,統一使用預處理語句(Prepared Statements),參數自動跳脫。
輔助:輸入驗證(白名單)、最小權限資料庫帳號、WAF 防護。
錯誤: 預設 latin1/utf8 導致 Emoji/生僻字存儲失敗、亂碼。
正解: 全鏈路 utf8mb4:
CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ciSET NAMES utf8mb4 / PDO charset=utf8mb4mb_internal_encoding('UTF-8')<meta charset="utf-8">錯誤: 撈全表回 PHP 循環計算平均值、去重、排序。
正解: 善用 SQL 聚合函數:AVG()、COUNT(DISTINCT ...)、GROUP BY、ORDER BY。
原則:資料處理下推至資料庫層,減少網路傳輸與記憶體佔用。
錯誤: 上線前未跑 EXPLAIN,無索引策略,不知 slow_query_log 為何物。
正解:
EXPLAIN,確認 type 非 ALL、key 命中預期索引。slow_query_log=1, long_query_time=1。pt-query-digest 分析 Top 慢查詢。Performance Schema、sys schema 監控。錯誤: VARCHAR 存日期、TEXT 存 JSON/序列化陣列。
正解: 嚴格匹配語義型別:
| 語義 | 正確型別 | 錯誤示例 |
|---|---|---|
| 日期時間 | DATETIME / TIMESTAMP | VARCHAR, INT |
| 金額/精確小數 | DECIMAL(19,4) | FLOAT, DOUBLE |
| 布林 | TINYINT(1) / BOOLEAN | VARCHAR('yes') |
| IP 地址 | INT UNSIGNED (INET_ATON/INET_NTOA) | VARCHAR(15) |
| 結構化資料 | JSON (MySQL 5.7+) | TEXT 存序列化 |
錯誤: 懶惰寫法,增加 I/O、網路、記憶體、快取失效風險。
正解: 顯式列出所需欄位,配合覆蓋索引實現 Using index。
原則: WHERE、JOIN ON、ORDER BY、GROUP BY 欄位建索引。
過度代價: 每個 INSERT/UPDATE/DELETE 需維護所有索引,寫入放大、磁碟佔用、統計資訊更新開銷。
策略: 定期 SHOW INDEX、sys.schema_unused_indexes 清理無用索引。
風險: 硬碟損壞、人為誤刪、勒索軟體、雲商跑路。
正解:
mysqldump --single-transaction + 異地儲存(S3/OSS/GCS)。視野局限: 以為 MySQL 是唯一選擇。
替代評估:
| 資料庫 | 定位 | 優勢 |
|---|---|---|
| PostgreSQL | 進階關係型 | 複雜查詢、JSONB、GIS、ACID 嚴格、免費開源 |
| MariaDB | MySQL 相容分支 | 更多引擎、優化器改進、社群驅動 |
| SQLite | 嵌入式/輕量 | 零配置、單檔案、適合邊緣/測試/小應用 |
| Redis | 記憶體鍵值 | 極速快取、計數器、Session、排行榜 |
| Elasticsearch | 全文搜尋/分析 | 倒排索引、聚合、日誌分析 |
| ClickHouse | OLAP 列式 | 億級聚合查詢毫秒級 |
避開這 11 個坑,您的 MySQL 應用將從「勉強可用」邁向「生產級穩健」。