SQL 聲明式語言,但執行有嚴格順序。理解順序有助於編寫高效查詢、排查邏輯錯誤。MySQL 執行 11 個階段,每階段產生一張虛擬表(VT),最終 VT 返回客戶端。
VT1。VT1 按連接條件過濾 → VT2。VT3;多表循環 1-3。VT3 按條件過濾 → VT4。VT4 分組 → VT5。VT6。VT6 分組後過濾 → VT7。VT8。VT9。VT10。VT11(最終結果)。錯誤:SELECT * FROM huge_table ORDER BY id LIMIT 1000000, 10(掃描 100 萬行再丟棄)。
優化:SELECT * FROM huge_table WHERE id > (SELECT id FROM huge_table ORDER BY id LIMIT 1000000, 1) ORDER BY id LIMIT 10(延遲關聯,利用覆蓋索引快速定位偏移量)。
EXPLAIN SELECT ... -- 查看 optimizer 實際執行順序(非邏輯順序) -- 關注:id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra