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

MySQL 實戰技巧筆記 13 條:NULL處理、OR優化、UNION選擇、大SQL拆分、批量導入、分批更新

     編輯:MySQL 綜合教學

1. NULL 參與 SUM 陷阱

SUM(A+B) != SUM(A)+SUM(B) 當 A 或 B 為 NULL 時,前者結果為 NULL。解決:SUM(IFNULL(A,0)+IFNULL(B,0)) 或 SUM(COALESCE(A,0)+COALESCE(B,0))。

2. 同列 OR 改 IN

WHERE c=1 OR c=2 OR c=3 → WHERE c IN (1,2,3)。OR 複雜度 O(n),IN 走範圍查詢 O(log n),IN 列表建議 < 200 個值。

OR vs IN

3. 不同列 OR 改 UNION

WHERE a=1 OR b=2 → SELECT ... WHERE a=1 UNION SELECT ... WHERE b=2。利用各自索引合併結果。

OR vs UNION

4. UNION ALL vs UNION

無需去重用 UNION ALL,避免排序去重開銷。

5. GROUP BY 去除隱式排序

GROUP BY col ORDER BY NULL 禁用默認排序,提升性能。

GROUP BY ORDER BY NULL

6. 字符轉數字提升索引效率

數字類型索引:體積小、比較快、存儲省。業務鍵盡量用 INT/BIGINT。

7. 拒絕大 SQL,拆解為多條簡單 SQL

  • 防單條 SQL 佔用所有資源導致阻塞
  • 簡單 SQL 緩存命中率高
  • 減少鎖表時間(特別是 MyISAM)
  • 利用多 CPU 並行(單 SQL 單線程)

8. 批量導入優先級

  1. LOAD DATA INFILE ≈ INSERT 快 20 倍
  2. INSERT VALUES (...),(...),(...) 減少索引刷新
  3. 無索引導入 > 有索引導入(建議先導數據後建索引)
  4. 避免 INSERT ... SELECT ...(延遲、同步出錯風險)

9. 大批量更新分時策略

  • 凌晨低峰無限制
  • 白天限流 100 行/秒(特殊協商)
  • 腳本內 SLEEP(0.01) 控制頻率

分批更新

10. INT(M) 顯示寬度誤區

INT(3) vs INT(11) 存儲均佔 4 字節,M 僅影響 ZEROFILL 時的前導零顯示(如 INT(3) ZEROFILL 存 10 顯示 010)。不限制存儲範圍。

11. COUNT(DISTINCT col) 是性能殺手

大數據量易 OOM。優化:臨時表法

-- 優化前
SELECT COUNT(DISTINCT uid) FROM big_table;
-- 優化後
CREATE TEMPORARY TABLE tmp_uid SELECT uid FROM big_table GROUP BY uid;
SELECT COUNT(*) FROM tmp_uid;

優化前 優化後

12. 常用函數速查

函數用法示例
REPLACE字符串替換UPDATE t SET c=REPLACE(c,'old','new')
CONCAT拼接SELECT CONCAT(a,'_',b) FROM t
IFNULLNULL 取默認IFNULL(expr1,expr2)
IF條件表達式IF(expr1, expr2, expr3)
CASE WHEN多分支CASE WHEN sex=1 THEN '男' ELSE '女' END

13. 單表去重保留最小 ID

DELETE FROM table_test
WHERE id NOT IN (
  SELECT id FROM (
    SELECT MIN(id) AS id FROM table_test GROUP BY uid
  ) t1
);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved