最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

MySQL中对于notin和minus使用的优化

来源:动视网 责编:小采 时间:2020-11-09 21:00:43
文档

MySQL中对于notin和minus使用的优化

MySQL中对于notin和minus使用的优化:优化前: 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 laoji
推荐度:
导读MySQL中对于notin和minus使用的优化:优化前: 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 laoji


优化前:

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.

优化后:

 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

在优化sql的时候,我们需要转变一下思路,等价的改写sql;

改写后的sql由于逻辑读得到了天翻地覆的改变,很快得到结果。

第一条sql执行计划中有一个函数,LNNVL(“A”.”APP_ID”<>:B1),lnnvl(exp)

如果exp的结果是false或者是unknown,那么lnnvl返回true;

如果exp的结果是true,返回false.

您可能感兴趣的文章:

  • 将MySQL的临时目录建立在内存中的教程
  • php简单操作mysql数据库的类
  • PHP使用mysqldump命令导出数据库
  • 文档

    MySQL中对于notin和minus使用的优化

    MySQL中对于notin和minus使用的优化:优化前: 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 laoji
    推荐度:
    标签: mysql 优化 minus
    • 热门焦点

    最新推荐

    猜你喜欢

    热门推荐

    专题
    Top