首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL查詢優化實戰:排除前N條數據、UNION去重與視圖重寫子查詢技巧

     編輯:MySQL 資料庫相關知識

痛點:子查詢不支持LIMIT與NOT IN性能陷阱

需求:查詢admin表除前3條(按userid排序)以外的所有數據。初始寫法:

SELECT * FROM admin 
WHERE userid NOT IN (SELECT userid FROM admin ORDER BY userid LIMIT 3)
ORDER BY userid DESC;

報錯:This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'。且NOT IN子查詢在大數據量下性能極差(無法使用索引、NULL值導致邏輯錯誤)。

最佳實踐:視圖+NOT EXISTS重寫

步驟一:創建視圖封裝子查詢

CREATE VIEW view_top3_admin AS 
SELECT * FROM admin ORDER BY userid LIMIT 3;

步驟二:主查詢使用NOT EXISTS關聯視圖

SELECT * FROM admin a 
WHERE NOT EXISTS (
    SELECT 1 FROM view_top3_admin b WHERE b.userid = a.userid
)
ORDER BY a.userid DESC;

原理解析:SELECT 1不讀取實際列數據,僅判斷存在性;NOT EXISTS可利用索引,且正確處理NULL值。視圖將LIMIT下推,繞過子查詢限制。

UNION與UNION ALL深度對比

特性UNIONUNION ALL
去重是(排序+唯一)否(直接合併)
性能較慢極快
適用場景結果集可能重複確認無重複或允許重複

黃金法則:能用UNION ALL絕不使用UNION。報表查詢、日誌合併、分表查詢聚合均優先選擇UNION ALL,必要時應用層去重。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved