MySQL中對于not in和minus使用的優(yōu)化
更新時間:2015年05月08日 10:23:44 作者:羅龍九
這篇文章主要介紹了MySQL中對于not in和minus使用的優(yōu)化,作者給出了實例和運行時間對比,需要的朋友可以參考下
優(yōu)化前:
select count(t.id)
from test t
where t.status = 1
and t.id not in (select distinct a.app_id
from test2 a
where a.type = 1
and a.rule_id in (152, 153, 154))
17:20:57 laojiu>@plan
PLAN_TABLE_OUTPUT
————————————————————————————————————————-
Plan hash value: 684502086
—————————————————————————————-
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
—————————————————————————————-
| 0 | SELECT STATEMENT | | 1 | 18 | 176K (2)| 00:35:23 |
| 1 | SORT AGGREGATE | | 1 | 18 | | |
|* 2 | FILTER | | | | | |
|* 3 | TABLE ACCESS FULL| test | 1141 | 20538 | 845 (2)| 00:00:11 |
|* 4 | TABLE ACCESS FULL| test2 | 1 | 12 | 309 (2)| 00:00:04 |
—————————————————————————————-
Predicate Information (identified by operation id):
—————————————————
2 – filter( NOT EXISTS (SELECT /*+ */ 0 FROM “test2″ “A” WHERE
“A”.”type”=1 AND (“A”.”RULE_ID”=152 OR “A”.”RULE_ID”=153 OR
“A”.”RULE_ID”=154) AND LNNVL(“A”.”APP_ID”<>:B1)))
3 – filter(“T”.”status”=1)
4 – filter(“A”.”type”=1 AND (“A”.”RULE_ID”=152 OR “A”.”RULE_ID”=153 OR
“A”.”RULE_ID”=154) AND LNNVL(“A”.”APP_ID”<>:B1))
Statistics
———————————————————-
0 recursive calls
0 db block gets
1762169 consistent gets
0 physical reads
0 redo size
519 bytes sent via SQL*Net to client
492 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
21 rows selected.
優(yōu)化后:
select count(*) from(
select t.id
from test t
where t.status = 1
minus
select distinct a.app_id
from test2 a
where a.type = 1
and a.rule_id in (152, 153, 154))
17:23:33 laojiu>@plan
PLAN_TABLE_OUTPUT
————————————————————————————————————————-
Plan hash value: 631655686
————————————————————————————————–
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
————————————————————————————————–
| 0 | SELECT STATEMENT | | 1 | | | 1501 (2)| 00:00:19 |
| 1 | SORT AGGREGATE | | 1 | | | | |
| 2 | VIEW | | 1141 | | | 1501 (2)| 00:00:19 |
| 3 | MINUS | | | | | | |
| 4 | SORT UNIQUE | | 1141 | 20538 | | 846 (2)| 00:00:11 |
|* 5 | TABLE ACCESS FULL| test | 1141 | 20538 | | 845 (2)| 00:00:11 |
| 6 | SORT UNIQUE | | 69527 | 814K| 3632K| 654 (2)| 00:00:08 |
|* 7 | TABLE ACCESS FULL| test2 | 84140 | 986K| | 308 (2)| 00:00:04 |
————————————————————————————————–
Predicate Information (identified by operation id):
—————————————————
5 – filter(“T”.”status”=1)
7 – filter(“A”.”type”=1 AND (“A”.”RULE_ID”=152 OR “A”.”RULE_ID”=153 OR
“A”.”RULE_ID”=154))
21 rows selected.
Statistics
———————————————————-
1 recursive calls
0 db block gets
2240 consistent gets
0 physical reads
0 redo size
516 bytes sent via SQL*Net to client
492 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
2 sorts (memory)
0 sorts (disk)
1 rows processed
在優(yōu)化sql的時候,我們需要轉變一下思路,等價的改寫sql;
改寫后的sql由于邏輯讀得到了天翻地覆的改變,很快得到結果。
第一條sql執(zhí)行計劃中有一個函數(shù),LNNVL(“A”.”APP_ID”<>:B1),lnnvl(exp)
如果exp的結果是false或者是unknown,那么lnnvl返回true;
如果exp的結果是true,返回false.
您可能感興趣的文章:
- 分析MySQL中優(yōu)化distinct的技巧
- mysql in語句子查詢效率慢的優(yōu)化技巧示例
- MySQL查詢優(yōu)化:連接查詢排序limit(join、order by、limit語句)介紹
- MySQL優(yōu)化之使用連接(join)代替子查詢
- SQL語句優(yōu)化之JOIN和LEFT JOIN 和 RIGHT JOIN語句的優(yōu)化
- SQL優(yōu)化之針對count、表的連接順序、條件順序、in及exist的優(yōu)化
- 關于mysql中innodb的count優(yōu)化問題分享
- MySQL中insert語句的使用與優(yōu)化教程
- SQL優(yōu)化教程之in與range查詢
相關文章
MySQL 可以用localhost 連接,但不能用IP連接的問題解決方法
這篇文章主要介紹了MySQL 可以用localhost 連接,但不能用IP連接的問題解決方法的相關資料,這里提供了解決方案,需要的朋友可以參考下2016-12-12
MySQL中case?when的兩種基本用法及區(qū)別總結
在mysql中case when用于計算條件列表并返回多個可能結果表達式之一,下面這篇文章主要給大家介紹了關于MySQL中case?when的兩種基本用法及區(qū)別的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2023-05-05
MYSQL加密和壓縮函數(shù)詳解以及實戰(zhàn)(附示例)
這篇文章主要給大家介紹了關于MYSQL加密和壓縮函數(shù)詳解以及實戰(zhàn)的相關資料,加密函數(shù)主要用來對數(shù)據(jù)進行加密和界面處理,以保證某些重要數(shù)據(jù)不被別人獲取,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2023-12-12

