修正:MySQL 5.5+ 默認 InnoDB。
- 事務、行鎖、外鍵、崩潰恢復 → **InnoDB**。
- 純讀、全文索引(5.6+ InnoDB 也支持)、極簡日誌表 → **MyISAM** 可考慮。
- 混合引擎:業務表 InnoDB,統計/日誌表 MyISAM/Archive。
修正:PHP 7.0 移除。強制遷移至 **PDO** 或 **mysqli**(預處理、物件導向、多驅動)。
虛擬主機無 mysqli?升級主機或用 PDO(內建 mysqlnd)。
修正:全量參數化查詢。
$stmt = $pdo->prepare('SELECT * FROM users WHERE id=?'); $stmt->execute([$id]);
框架 ORM/Query Builder 自動處理,嚴禁手工拼接。
修正:全鏈路 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 轉碼。
修正:
- 時間計算:應用層生成時間戳/日期字符串,SQL 只存/查。
- 複雜數學/字符串處理:PHP 處理後寫入,避免佔用 DB CPU。
- 分頁:大偏移 LIMIT 100000,20 極慢 → 游標分頁 WHERE id > last_id LIMIT 20。
修正:
- 開啟 slow_query_log,閾值 1s。
- EXPLAIN 分析,確保 type ≥ ref。
- 覆蓋索引消除回表。
- 避免 SELECT *、OR、LIKE '%...'、隱式轉換。
- 大表禁用 JOIN,應用層組裝。
修正:
- 整數:TINYINT/SMALLINT/MEDIUMINT/INT/BIGINT 按范圍最小化。
- 字符串:定長 CHAR、變長 VARCHAR、長文本 TEXT。
- **時間類型禁用 DATETIME/TIMESTAMP** → 統一 INT UNSIGNED 存 Unix 時間戳(跨時區、排序、分區、計算全優)。
- 金額:DECIMAL(19,4) 或存分為單位 BIGINT。
修正:顯式列出需要的列。
- 減少網絡傳輸、內存佔用、覆蓋索引命中率提升。
- ORM 指定 ->select(['id','name'])。
修正:
- 單表索引 ≤ 5 個,聯合索引遵循最左前綴。
- 低選擇性列(性別、狀態)不建單列索引,納入聯合索引。
- 定期 pt-index-usage / sys.schema_unused_indexes 清理無用索引。
修正:
- 物理備份:Percona XtraBackup(熱備、不鎖表)。
- 邏輯備份:mysqldump --single-transaction --master-data=2。
- **定期演練恢復**,驗證備份完整性。
- 異地多副本,RPO < 1h,RTO < 4h。
修正:多模持久化。
- 熱數據/緩存:**Redis**(String/Hash/Set/SortedSet)。
- 全文搜索:**Elasticsearch / Meilisearch**。
- 時序/指標:**InfluxDB / VictoriaMetrics**。
- 文檔/靈活 Schema:**MongoDB**。
- 圖關係:**Neo4j**。
- 列式分析:**ClickHouse / Apache Doris**。
MySQL 只做它最擅長的:關係型、事務型、結構化核心業務數據。