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

MySQL UNION 避免順序掃描實戰:將 OR 條件拆分為 UNION ALL 走索引路徑

     編輯:MySQL 綜合教學

前言

OR 條件常導致優化器放棄索引、退化為全表掃描。本文示範將 OR 拆分為 UNION ALL,使各分支各自命中索引,消除順序存取,大幅提升效能。

問題 SQL

SELECT * FROM orders
WHERE (customer_num=104 AND order_num>1001) OR order_num=1008;

雖 customer_num、order_num 均有索引,優化器仍選全表掃描 (無法合併兩個索引範圍)。

優化改寫

SELECT * FROM orders WHERE customer_num=104 AND order_num>1001
UNION ALL
SELECT * FROM orders WHERE order_num=1008;
  • 第一分支走 INDEX (customer_num, order_num) 範圍掃描。
  • 第二分支走 INDEX (order_num) 等值查找。
  • UNION ALL 不去重,效能優於 UNION (去重需排序/臨時表)。
  • 若業務允許重複或確知無重複,**優先用 UNION ALL**。

巢狀查詢順序存取風險

3 層巢狀查詢,每層 1000 行 → 10 億行掃描。核心解法:**連接欄位加索引** (如學號)。

延伸閱讀

  • 5 種常見 MySQL 日誌類型
  • MySQL 日誌檔案詳細說明
  • 重定位 MySQL 資料目錄方法
  • MySQL 資料庫表表示
  • MySQL 資料檔三種修復方法
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved