整理自面試高頻考點與生產實踐,涵蓋 SQL 優化、索引策略、架構設計等核心領域。
WHERE、ORDER BY 涉及的列上建立索引WHERE num IS NULL 導致索引失效 → 設置默認值 0,改為 WHERE num = 0WHERE num=10 OR name='admin' 若其中一列無索引會全表掃描 → 改用 UNION ALL 分開查詢BETWEEN,子查詢優先考慮 EXISTS 替代 INWHERE num = @num 編譯時無法確定值 → 強制指定索引 WITH(INDEX(...))WHERE num/2=100 → WHERE num=200;SUBSTRING(name,1,3)='abc' → name LIKE 'abc%'SELECT INTO 避免大量日誌,用完顯式 TRUNCATE + DROP場景:線上網站需刪除歷史日誌,直接 DELETE 會鎖表導致服務不可用。
-- 批量刪除模板(MySQL)
WHILE 1=1 DO
DELETE FROM logs WHERE log_date <= '2012-11-01' LIMIT 1000;
IF ROW_COUNT() = 0 THEN
LEAVE; -- 刪除完成退出
END IF;
DO SLEEP(0.05); -- 釋放鎖,讓其他線程可訪問
END WHILE;
關鍵點:
LIMIT 1000 控制單次事務行數,縮短鎖持有時間SLEEP/USLEEP 主動讓出 CPU,允許其他查詢插入INSERT、UPDATE數據庫優化是系統工程,需結合業務場景、數據分佈、硬件資源綜合考量。上述 31 條為通用原則,具體執行時請務必 EXPLAIN 實測、壓測驗證、灰度發布。