加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

Mysql入门MySQL中对于not in和minus使用的优化

发布时间:2020-12-12 01:22:06 所属栏目:MySql教程 来源:网络整理
导读:《Mysql入门MySQL中对于not in和minus使用的优化》要点: 本文介绍了Mysql入门MySQL中对于not in和minus使用的优化,希望对您有用。如果有疑问,可以联系我们。 优化前: MYSQL数据库 select count(t.id) from test t where t.status = 1 and t.id not in (s

《Mysql入门MySQL中对于not in和minus使用的优化》要点:
本文介绍了Mysql入门MySQL中对于not in和minus使用的优化,希望对您有用。如果有疑问,可以联系我们。

优化前:
MYSQL数据库

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 C 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 C filter(“T”.”status”=1)
  4 C 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.

优化后:
MYSQL数据库

 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,154))
17:23:33 laojiu>@plan
PLAN_TABLE_OUTPUT
――――――――――――――――――――――――――――――――――――――――-
Plan hash value: 631655686
――――――――――――――――――――――――――――――――C
| Id | Operation       | Name       | Rows | Bytes |TempSpc| Cost (%CPU)| Time   |
――――――――――――――――――――――――――――――――C
|  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 |
――――――――――――――――――――――――――――――――C
Predicate Information (identified by operation id):
―――――――――――――――――
  5 C filter(“T”.”status”=1)
  7 C 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;MYSQL数据库

改写后的sql由于逻辑读得到了天翻地覆的改变,很快得到结果.MYSQL数据库

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

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

如果exp的结果是true,返回false.
MYSQL数据库

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读