首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

PHP 程式設計師最常犯的 11 個 MySQL 錯誤與最佳實踐指南

     編輯:MySQL 資料庫相關知識

資料庫是 Web 應用基石,MySQL 在 LAMP 棧中佔核心地位。PHP 入門易、精通難,許多開發者能快速寫出功能代碼,卻在資料庫設計、安全、效能上埋下隱患。本文梳理 11 大高頻錯誤,附帶修正方案與現代最佳實踐。

1. 使用 MyISAM 而非 InnoDB ❌

錯誤: MySQL 預設引擎曾為 MyISAM,不支援交易、外鍵、行鎖,寫入時全表鎖定,高並發效能極差。
正解: 預設改用 InnoDB(5.5+ 已為預設)。支援 ACID、行鎖、外鍵、MVCC,唯一例外:純讀取、無交易需求的日誌/快取表可考慮 MyISAM/Memory。

2. 仍在使用已棄用的 mysql_* 函數 ❌

錯誤: 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();

3. 未處理使用者輸入 → SQL 注入漏洞 ❌

錯誤: 直接拼接 $_POST 變數進 SQL。
攻擊例: username = "admin' --" 繞過密碼驗證。
正解: 永不信任輸入,統一使用預處理語句(Prepared Statements),參數自動跳脫。
輔助:輸入驗證(白名單)、最小權限資料庫帳號、WAF 防護。

4. 忽略 UTF-8/utf8mb4 國際化支援 ❌

錯誤: 預設 latin1/utf8 導致 Emoji/生僻字存儲失敗、亂碼。
正解: 全鏈路 utf8mb4:

  • 資料庫/表/欄位:CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  • 連線:SET NAMES utf8mb4 / PDO charset=utf8mb4
  • PHP:mb_internal_encoding('UTF-8')
  • HTML:<meta charset="utf-8">

5. 用 PHP 邏輯替代 SQL 集合運算 ❌

錯誤: 撈全表回 PHP 循環計算平均值、去重、排序。
正解: 善用 SQL 聚合函數:AVG()、COUNT(DISTINCT ...)、GROUP BY、ORDER BY。
原則:資料處理下推至資料庫層,減少網路傳輸與記憶體佔用。

6. 不優化查詢:缺乏 EXPLAIN、索引、慢查詢分析 ❌

錯誤: 上線前未跑 EXPLAIN,無索引策略,不知 slow_query_log 為何物。
正解:

  • 每條上線 SQL 必跑 EXPLAIN,確認 type 非 ALL、key 命中預期索引。
  • 開啟慢查詢日誌:slow_query_log=1, long_query_time=1。
  • 定期 pt-query-digest 分析 Top 慢查詢。
  • 善用 Performance Schema、sys schema 監控。

7. 資料型別選擇錯誤:用字串存日期、序列化物件 ❌

錯誤: VARCHAR 存日期、TEXT 存 JSON/序列化陣列。
正解: 嚴格匹配語義型別:

語義正確型別錯誤示例
日期時間DATETIME / TIMESTAMPVARCHAR, INT
金額/精確小數DECIMAL(19,4)FLOAT, DOUBLE
布林TINYINT(1) / BOOLEANVARCHAR('yes')
IP 地址INT UNSIGNED (INET_ATON/INET_NTOA)VARCHAR(15)
結構化資料JSON (MySQL 5.7+)TEXT 存序列化

8. 使用 SELECT * ❌

錯誤: 懶惰寫法,增加 I/O、網路、記憶體、快取失效風險。
正解: 顯式列出所需欄位,配合覆蓋索引實現 Using index。

9. 索引策略缺失:無索引或過度索引 ❌

原則: WHERE、JOIN ON、ORDER BY、GROUP BY 欄位建索引。
過度代價: 每個 INSERT/UPDATE/DELETE 需維護所有索引,寫入放大、磁碟佔用、統計資訊更新開銷。
策略: 定期 SHOW INDEX、sys.schema_unused_indexes 清理無用索引。

10. 無備份、無災難恢復演練 ❌

風險: 硬碟損壞、人為誤刪、勒索軟體、雲商跑路。
正解:

  • 自動化備份:mysqldump --single-transaction + 異地儲存(S3/OSS/GCS)。
  • 二進制日誌備份(PITR 時間點恢復)。
  • 每季度**實戰演練**完整恢復流程,驗證 RPO/RTO。

11. 不考慮替代資料庫方案 ❌

視野局限: 以為 MySQL 是唯一選擇。
替代評估:

資料庫定位優勢
PostgreSQL進階關係型複雜查詢、JSONB、GIS、ACID 嚴格、免費開源
MariaDBMySQL 相容分支更多引擎、優化器改進、社群驅動
SQLite嵌入式/輕量零配置、單檔案、適合邊緣/測試/小應用
Redis記憶體鍵值極速快取、計數器、Session、排行榜
Elasticsearch全文搜尋/分析倒排索引、聚合、日誌分析
ClickHouseOLAP 列式億級聚合查詢毫秒級

總結:從「能跑」到「穩健」的進階清單

  • [ ] 全專案遷移至 MySQLi/PDO + 預處理語句
  • [ ] 全鏈路 utf8mb4
  • [ ] 核心表 InnoDB + 合理索引
  • [ ] 慢查詢日誌 + 定期分析機制
  • [ ] 自動化備份 + 季度恢復演練
  • [ ] 資料型別語義化、拒絕 SELECT *
  • [ ] 評估業務場景引入專用存儲

避開這 11 個坑,您的 MySQL 應用將從「勉強可用」邁向「生產級穩健」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved