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

MySQL JOIN 深度解析:INNER/LEFT/RIGHT JOIN 差異、字符集不一致導致性能災難

     編輯:MySQL 綜合教學

JOIN 三大類型語義與圖解

類型語義關鍵字結果集
INNER JOIN雙向匹配,僅保留雙方都有的行INNER JOIN / JOIN交集
LEFT JOIN左表全保留,右表無匹配則 NULLLEFT [OUTER] JOIN左表全集 + 右表匹配
RIGHT JOIN右表全保留,左表無匹配則 NULLRIGHT [OUTER] JOIN右表全集 + 左表匹配

MySQL 不支援 FULL JOIN,可用 LEFT JOIN UNION RIGHT JOIN 模擬。

基礎語法

INNER JOIN 結果

  • uid=3 用戶無文章 → INNER JOIN 不出現,LEFT JOIN 出現(文章欄位 NULL)
  • aid=4 文章無對應用戶 → INNER JOIN 不出現,RIGHT JOIN 出現(用戶欄位 NULL)

CROSS JOIN = 笛卡爾積

SELECT SQL_NO_CACHE t1.name, t2.name FROM t1 LEFT JOIN t2 ON t1.name = t2.name WHERE t2.name IS NULL LIMIT 30;
SELECT SQL_NO_CACHE t1.name, t3.name FROM t1 LEFT JOIN t3 ON t1.name = t3.name WHERE t3.name IS NULL LIMIT 30;

驚人差異

JOIN 對象耗時EXPLAIN 關鍵欄位
t2 (utf8)0.0010 秒type=ref, Extra=Using where; Using index
t3 (gb2312)0.1871 秒type=ALL, Extra=Using where

差兩個數量級!

根因分析

EXPLAIN 輸出

  • 字符集不同 → 隱式轉換 → 索引失效 → 全表掃描
  • t3 變為 type=ALL,每行需轉換字符集後比對

最佳實踐

  1. 統一字符集:庫、表、欄位、連線全鏈路 utf8mb4
  2. JOIN 欄位類型、長度、字符集、校對規則完全一致
  3. SQL_NO_CACHE 測試真實性能,避免查詢快取干擾
  4. 小表驅動大表:驅動表 = 過濾後結果集小的表
  5. 關聯欄位必須有索引,組合索引遵循最左前綴
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved