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

所属分类: 数据库 / Mysql 阅读数: 317
收藏 0 赞 0 分享

优化前:

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数据表的基本操作之表结构操作,字段操作实例分析

这篇文章主要介绍了mysql数据表的基本操作之表结构操作,字段操作,结合实例形式分析了mysql表结构操作,字段操作常见增删改查实现技巧与操作注意事项,需要的朋友可以参考下
收藏 0 赞 0 分享

mysql学习笔记之完整的select语句用法实例详解

这篇文章主要介绍了mysql学习笔记之完整的select语句用法,结合实例形式详细分析了mysql select语句各种常见参数、使用方法及操作注意事项,需要的朋友可以参考下
收藏 0 赞 0 分享

MySQL5.6 GTID模式下同步复制报错不能跳过的解决方法

搭建虚拟机centos6.0, mysql5.6.10主从复制,死活不同步,搞了一整天找到这篇文章终于OK了,特分享一下,需要的朋友可以参考下
收藏 0 赞 0 分享

MySQL开启慢查询方法及实例

这篇文章主要介绍了MySQL开启慢查询方法及实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

简单了解MYSQL数据库优化阶段

这篇文章主要介绍了简单了解MYSQL数据库优化阶段,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Windows下MySQL主从复制的配置方法

MySQL主从复制允许将来自一个数据库(主数据库)的数据复制到一个或多个数据库(从数据库),主数据库一般是实时的业务数据写入和更新操作,从数据库常用的读取为主
收藏 0 赞 0 分享

Mysql数据库设计三范式实例解析

这篇文章主要介绍了Mysql数据库设计三范式实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

mysql数据类型和字段属性原理与用法详解

这篇文章主要介绍了mysql数据类型和字段属性,结合实例形式分析了mysql数据类型和字段属性基本概念、原理、分类、用法及操作注意事项,需要的朋友可以参考下
收藏 0 赞 0 分享

mysql连接查询、联合查询、子查询原理与用法实例详解

这篇文章主要介绍了mysql连接查询、联合查询、子查询原理与用法,结合实例形式详细分析了mysql连接查询、联合查询、子查询的基本概念、功能、原理、用法及操作注意事项,需要的朋友可以参考下
收藏 0 赞 0 分享

Window下如何恢复被删除的Mysql8.0.17 Root账户及密码

这篇文章主要介绍了Window下如何恢复被删除的Mysql8.0.17 Root账户及密码,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多