> 데이터 베이스 > MySQL 튜토리얼 > IN에서 INNER JOIN으로의 mysql 최적화 공유 예

IN에서 INNER JOIN으로의 mysql 최적화 공유 예

黄舟
풀어 주다: 2019-02-23 15:31:38
원래의
4192명이 탐색했습니다.

오늘 코딩을 하다가 SQL 문제가 발생했습니다.

(추천 관련 mysql 동영상 튜토리얼: "mysql tutorial")

테이블 A의 ID를 테이블 B의 ID와 일치시키려면 테이블 B의 ID 모든 내용 쿼리:

최적화 전:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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)

로그인 후 복사

최적화 후:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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)

로그인 후 복사

실행 계획 비교 보기:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

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       | <union2,3>          | ALL   | NULL          | NULL    | NULL    | NULL | NULL | Using temporary          |

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

4 rows in set (0.00 sec)

로그인 후 복사

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

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      | <derived2>          | 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 | <union2,3>          | ALL    | NULL          | NULL    | NULL    | NULL  | NULL | Using temporary          |

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

5 rows in set (0.00 sec)

로그인 후 복사

위 내용은 IN에서 INNER JOIN으로의 mysql 최적화 공유 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿