MySQL中in(獨立子查詢)的執行計劃
在之前有一篇文章講了in(常量列表)的執行計劃,詳見連結:http://blog.itpub.net/28912557/viewspace-1255568/。
那麼對於對於in(獨立子查詢),MYSQL會怎麼執行呢?其實,現代mysql最佳化器都會將in獨立子查詢語句轉換為exists相關子查詢。
所以有些人發現在MYSQl中測試發現in與exists效能差不多,就是這個原因。因此我們就不必糾結是選擇in還是exists了,大部分情況下,其實都一樣。
但是這裡有一個問題,假如外部查詢、子查詢分別有M、N條記錄,那麼整個查詢會進行O(M+M*N)次掃描,意味著邏輯IO大大增加。(M為外部表查詢掃描次數,M*N為exists相關子查詢掃描次數)。
為了減少邏輯IO,可以對相關子查詢進行最佳化,譬如:
1,對子查詢建立索引,這是顯而易見的。
2,假如子查詢中有group by操作,每一次關聯外部查詢都會進行group by,可以考慮在子查詢外面再巢狀一層子查詢,做成靜態的,減少邏輯IO。
3,使用派生表重寫子查詢,進行表連線。
總之,按需求來最佳化。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28912557/viewspace-1445484/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 執行計劃-6:推入子查詢
- explain 查詢執行計劃AI
- 在MySQL中使用explain查詢SQL的執行計劃MySqlAI
- oracle查詢語句執行計劃中的表消除Oracle
- MySQL中in(常量列表)的執行計劃MySql
- PostgreSQL 查詢當前執行中sql的執行計劃——pg_show_plans模組SQL
- 透過查詢檢視sql執行計劃SQL
- MySQL 執行計劃MySql
- MySQL執行計劃MySql
- mysql的子查詢MySql
- (4) MySQL中EXPLAIN執行計劃分析MySqlAI
- MySql中執行計劃如何來的——Optimizer TraceMySql
- MySQL子查詢MySql
- MYsql 子查詢MySql
- mysql執行計劃explainMySqlAI
- mysql explain 執行計劃MySqlAI
- MySQL執行計劃解析MySql
- 生產庫中遇到mysql的子查詢MySql
- [oracle] 查詢歷史會話、歷史執行計劃Oracle會話
- MySQL 查詢處理 SQL查詢執行順序MySql
- 基於UNION ALL的分頁查詢執行計劃問題
- 通過等待事件來獲得查詢SQl的執行計劃事件SQL
- 關於mysql 子查詢中 使用 limitMySqlMIT
- 如何在Linux中執行MySQL/MariaDB查詢LinuxMySql
- 如何在MySQL中查詢OS執行緒id(LWP)?MySql執行緒
- 【Mysql】MySQL查詢計劃key_len全知道MySql
- MySQL聯結查詢和子查詢MySql
- MySQL執行計劃解析(四)MySql
- 讀懂MySQL執行計劃MySql
- 讀懂 MySQL 執行計劃MySql
- mysql索引和執行計劃MySql索引
- 淺談執行緒池(中):獨立執行緒池的作用及IO執行緒池執行緒
- Mysql中的巢狀子查詢問題QSBSMySql巢狀
- MySql中limit子查詢的解決辦法MySqlMIT
- MySQL查詢優化之優化器工作流程以及優化的執行計劃生成MySql優化
- MySQL學習 - 查詢的執行過程MySql
- MySQL 查詢常用操作(0) —— 查詢語句的執行順序MySql
- 基於UNION ALL的分頁查詢執行計劃問題(二)