首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 開發者常犯的 11 個 MySQL 錯誤與修正指南

     編輯:PHP 綜合知識

錯誤 1:盲目選擇 MyISAM,忽視 InnoDB

修正:MySQL 5.5+ 默認 InnoDB。
- 事務、行鎖、外鍵、崩潰恢復 → **InnoDB**。
- 純讀、全文索引(5.6+ InnoDB 也支持)、極簡日誌表 → **MyISAM** 可考慮。
- 混合引擎:業務表 InnoDB,統計/日誌表 MyISAM/Archive。

錯誤 2:仍用 mysql_* 系列函數

修正:PHP 7.0 移除。強制遷移至 **PDO** 或 **mysqli**(預處理、物件導向、多驅動)。
虛擬主機無 mysqli?升級主機或用 PDO(內建 mysqlnd)。

錯誤 3:不防 SQL 注入

修正:全量參數化查詢。
$stmt = $pdo->prepare('SELECT * FROM users WHERE id=?'); $stmt->execute([$id]);
框架 ORM/Query Builder 自動處理,嚴禁手工拼接。

錯誤 4:編碼不統一用 UTF-8

修正:全鏈路 UTF-8(推薦 utf8mb4)。
- 數據庫/表/列:CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
- 連接:SET NAMES utf8mb4 / PDO DSN charset=utf8mb4
- HTML:<meta charset="utf-8">
- PHP 文件保存為 UTF-8 無 BOM。
GBK 歷史項目:新表 utf8mb4,舊表逐步遷移,中間層 iconv 轉碼。

錯誤 5:在 SQL 做本應在應用層做的計算

修正:
- 時間計算:應用層生成時間戳/日期字符串,SQL 只存/查。
- 複雜數學/字符串處理:PHP 處理後寫入,避免佔用 DB CPU。
- 分頁:大偏移 LIMIT 100000,20 極慢 → 游標分頁 WHERE id > last_id LIMIT 20。

錯誤 6:不優化慢查詢

修正:
- 開啟 slow_query_log,閾值 1s。
- EXPLAIN 分析,確保 type ≥ ref。
- 覆蓋索引消除回表。
- 避免 SELECT *、OR、LIKE '%...'、隱式轉換。
- 大表禁用 JOIN,應用層組裝。

錯誤 7:字段類型選擇不當

修正:
- 整數:TINYINT/SMALLINT/MEDIUMINT/INT/BIGINT 按范圍最小化。
- 字符串:定長 CHAR、變長 VARCHAR、長文本 TEXT。
- **時間類型禁用 DATETIME/TIMESTAMP** → 統一 INT UNSIGNED 存 Unix 時間戳(跨時區、排序、分區、計算全優)。
- 金額:DECIMAL(19,4) 或存分為單位 BIGINT。

錯誤 8:SELECT *

修正:顯式列出需要的列。
- 減少網絡傳輸、內存佔用、覆蓋索引命中率提升。
- ORM 指定 ->select(['id','name'])。

錯誤 9:索引缺失或過度索引

修正:
- 單表索引 ≤ 5 個,聯合索引遵循最左前綴。
- 低選擇性列(性別、狀態)不建單列索引,納入聯合索引。
- 定期 pt-index-usage / sys.schema_unused_indexes 清理無用索引。

錯誤 10:無備份 / 備份不可用

修正:
- 物理備份:Percona XtraBackup(熱備、不鎖表)。
- 邏輯備份:mysqldump --single-transaction --master-data=2。
- **定期演練恢復**,驗證備份完整性。
- 異地多副本,RPO < 1h,RTO < 4h。

錯誤 11:不考慮其他存儲方案

修正:多模持久化。
- 熱數據/緩存:**Redis**(String/Hash/Set/SortedSet)。
- 全文搜索:**Elasticsearch / Meilisearch**。
- 時序/指標:**InfluxDB / VictoriaMetrics**。
- 文檔/靈活 Schema:**MongoDB**。
- 圖關係:**Neo4j**。
- 列式分析:**ClickHouse / Apache Doris**。
MySQL 只做它最擅長的:關係型、事務型、結構化核心業務數據。

總結檢查清單

  1. 引擎選對了嗎?
  2. 用 PDO/mysqli 了嗎?
  3. 全參數化了嗎?
  4. 全鏈路 utf8mb4 了嗎?
  5. 時間存 INT 了嗎?
  6. 慢查詢分析了嗎?
  7. 字段類型最小化了嗎?
  8. 禁用 SELECT * 了嗎?
  9. 索引審計了嗎?
  10. 備份演練了嗎?
  11. 該上 Redis/ES 了嗎?
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved