接續基礎優化,本文深入剖析索引應用、WHERE 子句重寫、LEFT JOIN 優化、LIMIT 分頁技巧以及 INSERT/UPDATE/DELETE 寫入優化的核心策略。
MySQL 索引(PRIMARY、UNIQUE、INDEX)均基於 B+ 樹存儲,主要服務於:
維護成本:寫入操作(INSERT/UPDATE/DELETE)需同步維護索引,過多索引會拖慢寫入。使用 myisamchk --analyze 分析表統計信息,myisamchk --sort-index --sort-records=1 可按索引順序重組數據提升範圍查詢速度。
MySQL 查詢優化器會自動執行以下轉換:
((a AND b) AND c) → a AND b AND ca=5 AND b>5 → 常量預計算(b=5 AND 5=5) OR (b=100 AND 2=3) → b=5SQL_SMALL_RESULT 時創建內存臨時表MySQL 執行 A LEFT JOIN B 時:
WHERE ... IS NULL 反向查找時,找到首個匹配行即停止掃描LIMIT 1 等效於「找到即停」,大表單行查詢極快LIMIT N OFFSET M 配合 ORDER BY:找到第 N 行即終止排序,避免全表排序LIMIT + DISTINCT:去重達到限制即停止LIMIT 0 快速返回空集合,可用於獲取表結構單行插入耗時分解:連接(3) + 發送查詢(2) + 分析(2) + 寫入數據(1×大小) + 寫入索引(1×索引) + 關閉(1)
加速策略:
INSERT INTO t VALUES(...),(...),(...) 單語句插入多行,減少網絡往返與解析開銷LOCK TABLES t WRITE; INSERT...; UNLOCK TABLES 將索引緩存一次性刷盤,整體提速 40%+。長事務建議每 1000 行釋放鎖平衡併發TRUNCATE TABLE 替代全表刪除(無事務、無觸發器、極快)