mysql in转化为join_mysql 优化例子:IN 换 INNER JOIN

今天撸代码时,遇到SQL问题:

要将A表查询的ID,匹配B表的ID,并将B表全部内容查询出来:

未优化前:

MySQL [xxuer]> SELECT

->     COUNT(*)

-> FROM

->     t_cmdb_app_version

-> WHERE

->     id IN (SELECT

->             pid

->         FROM

->             t_cmdb_app_relation UNION SELECT

->             rp_id

->         FROM

->             t_cmdb_app_relation);

+----------+

| COUNT(*) |

+----------+

|      266 |

+----------+

1 row in set (0.21 sec)

优化后:

MySQL [xxuer]> SELECT

->     count(*)

-> FROM

->     t_cmdb_app_version a

->         INNER JOIN

->     (SELECT

->         pid

->     FROM

->         t_cmdb_app_relation UNION SELECT

->         rp_id

->     FROM

->         t_cmdb_app_relation) b ON a.id = b.pid;

+----------+

| count(*) |

+----------+

|      266 |

+----------+

1 row in set (0.00 sec)

查看执行计划对比:

MySQL [xxuer]> explain SELECT

->     COUNT(*)

-> FROM

->     t_cmdb_app_version

-> WHERE

->     id IN (SELECT

->             pid

->         FROM

->             t_cmdb_app_relation UNION SELECT

->             rp_id

->         FROM

->             t_cmdb_app_relation);

+----+--------------------+---------------------+-------+---------------+---------+---------+------+------+--------------------------+

| id | select_type        | table               | type  | possible_keys | key     | key_len | ref  | rows | Extra                    |

+----+--------------------+---------------------+-------+---------------+---------+---------+------+------+--------------------------+

|  1 | PRIMARY            | t_cmdb_app_version  | index | NULL          | PRIMARY | 4       | NULL |  659 | Using where; Using index |

|  2 | DEPENDENT SUBQUERY | t_cmdb_app_relation | ALL   | NULL          | NULL    | NULL    | NULL |  383 | Using where              |

|  3 | DEPENDENT UNION    | t_cmdb_app_relation | ALL   | NULL          | NULL    | NULL    | NULL |  383 | Using where              |

| NULL | UNION RESULT       |           | ALL   | NULL          | NULL    | NULL    | NULL | NULL | Using temporary          |

+----+--------------------+---------------------+-------+---------------+---------+---------+------+------+--------------------------+

4 rows in set (0.00 sec)

MySQL [xxuer]> explain SELECT

->     count(*)

-> FROM

->     t_cmdb_app_version a

->         INNER JOIN

->     (SELECT

->         pid

->     FROM

->         t_cmdb_app_relation UNION SELECT

->         rp_id

->     FROM

->         t_cmdb_app_relation) b ON a.id = b.pid;

+----+--------------+---------------------+--------+---------------+---------+---------+-------+------+--------------------------+

| id | select_type  | table               | type   | possible_keys | key     | key_len | ref   | rows | Extra                    |

+----+--------------+---------------------+--------+---------------+---------+---------+-------+------+--------------------------+

|  1 | PRIMARY      |           | ALL    | NULL          | NULL    | NULL    | NULL  |  766 | Using where              |

|  1 | PRIMARY      | a                   | eq_ref | PRIMARY       | PRIMARY | 4       | b.pid |    1 | Using where; Using index |

|  2 | DERIVED      | t_cmdb_app_relation | ALL    | NULL          | NULL    | NULL    | NULL  |  383 | NULL                     |

|  3 | UNION        | t_cmdb_app_relation | ALL    | NULL          | NULL    | NULL    | NULL  |  383 | NULL                     |

| NULL | UNION RESULT |           | ALL    | NULL          | NULL    | NULL    | NULL  | NULL | Using temporary          |

+----+--------------+---------------------+--------+---------------+---------+---------+-------+------+--------------------------+

5 rows in set (0.00 sec)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值