복붙노트

[SQL] MySQL의 : 내부 어디 대 가입 [중복]

SQL

MySQL의 : 내부 어디 대 가입 [중복]

(MySQL의에서) 성능의 차이 사이가 있습니까

Select * from Table1 T1 
Inner Join Table2 T2 On T1.ID = T2.ID

Select * from Table1 T1, Table2 T2 
Where T1.ID = T2.ID

?

해결법

  1. ==============================

    1.질문 44,917에서 허용 대답에서 가져온 다음과 같음 :

    질문 44,917에서 허용 대답에서 가져온 다음과 같음 :

    MySQL의에서 결과는 동일합니다.

    나는 개인적으로 그 일의 "사회적으로 허용되는"방법입니다 ... 명시 적으로 테이블을 조인 스틱 것입니다.

  2. ==============================

    2.그들은 동일합니다. 이것은 명령을 EXPLAIN 실행하여 볼 수 있습니다 :

    그들은 동일합니다. 이것은 명령을 EXPLAIN 실행하여 볼 수 있습니다 :

    mysql> explain Select * from Table1 T1 
        -> Inner Join Table2 T2 On T1.ID = T2.ID;
    +----+-------------+-------+-------+---------------+---------+---------+------+------+---------------------------------------------+
    | id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows | Extra                                       |
    +----+-------------+-------+-------+---------------+---------+---------+------+------+---------------------------------------------+
    |  1 | SIMPLE      | T1    | index | PRIMARY       | PRIMARY | 4       | NULL |    4 | Using index                                 |
    |  1 | SIMPLE      | T2    | index | PRIMARY       | PRIMARY | 4       | NULL |    4 | Using where; Using index; Using join buffer |
    +----+-------------+-------+-------+---------------+---------+---------+------+------+---------------------------------------------+
    2 rows in set (0.00 sec)
    
    mysql> explain Select * from Table1 T1, Table2 T2 
        -> Where T1.ID = T2.ID;
    +----+-------------+-------+-------+---------------+---------+---------+------+------+---------------------------------------------+
    | id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows | Extra                                       |
    +----+-------------+-------+-------+---------------+---------+---------+------+------+---------------------------------------------+
    |  1 | SIMPLE      | T1    | index | PRIMARY       | PRIMARY | 4       | NULL |    4 | Using index                                 |
    |  1 | SIMPLE      | T2    | index | PRIMARY       | PRIMARY | 4       | NULL |    4 | Using where; Using index; Using join buffer |
    +----+-------------+-------+-------+---------------+---------+---------+------+------+---------------------------------------------+
    2 rows in set (0.00 sec)
    
  3. ==============================

    3.나는 기반 쉼표 대신 INNER 조인을 사용하는 오래된 응용 프로그램의 성능을 분석하고 따라 내게 잘 하나 늦게 대답은, JOIN 절을.

    나는 기반 쉼표 대신 INNER 조인을 사용하는 오래된 응용 프로그램의 성능을 분석하고 따라 내게 잘 하나 늦게 대답은, JOIN 절을.

    그래서 여기 조인이 두 테이블은 (모두 기록보다 1 락보다 더 있습니다). 가입 기반의 쉼표를 가지고 쿼리를 실행하면, 내부는 경우 가입보다 훨씬 더 오래 걸립니다.

    나는 문을 설명 분석 할 때, 나는 쿼리 가진 쉼표가이 버퍼 조인 사용 된 조인 것을 발견했다. 그러나 INNER JOIN 절을 갖는 질의는 '어디에 사용'했다.

    쿼리 설명의 행 열에서와 같이 이러한 쿼리는 크게 다르다. 이 내 쿼리와 자신의 설명 각각의 결과이다.

    explain select count(*) FROM mbst a , his_moneypv2 b 
            WHERE b.yymm IN ('200802','200811','201001','201002','201003') 
            AND a.tel3 != '' 
            AND a.mb_no = b.mb_no 
            AND b.true_grade_class IN (3,6)
            OR b.grade_class IN (4,7);
    
    +----+-------------+-------+-------------+----------------------------------------------------------------+--------------------------------------+---------+------+--------+---------------------------------------------------------------------+
    | id | select_type | table | type        | possible_keys                                                  | key                                  | key_len | ref  | rows   | Extra                                                               |
    +----+-------------+-------+-------------+----------------------------------------------------------------+--------------------------------------+---------+------+--------+---------------------------------------------------------------------+
    |  1 | SIMPLE      | b     | index_merge | PRIMARY,mb_no,yymm,yymm_2,idx_true_grade_class,idx_grade_class | idx_true_grade_class,idx_grade_class | 5,9     | NULL |  16924 | Using sort_union(idx_true_grade_class,idx_grade_class); Using where |
    |  1 | SIMPLE      | a     | ALL         | PRIMARY                                                        | NULL                                 | NULL    | NULL | 134472 | Using where; Using join buffer                                      |
    +----+-------------+-------+-------------+----------------------------------------------------------------+--------------------------------------+---------+------+--------+---------------------------------------------------------------------+
    

    누구에게 누구로부터

    explain select count(*) FROM mbst a inner join his_moneypv2 b 
            on a.mb_no = b.mb_no 
            WHERE b.yymm IN ('200802','200811','201001','201002','201003') 
            AND a.tel3 != '' 
            AND b.true_grade_class IN (3,6) 
            OR b.grade_class IN (4,7);
    
     +----+-------------+-------+-------------+----------------------------------------------------------------+--------------------------------------+---------+--------------------+-------+---------------------------------------------------------------------+
     | id | select_type | table | type        | possible_keys                                                  | key                                  | key_len | ref                | rows  | Extra                                                               |
     +----+-------------+-------+-------------+----------------------------------------------------------------+--------------------------------------+---------+--------------------+-------+---------------------------------------------------------------------+
     |  1 | SIMPLE      | b     | index_merge | PRIMARY,mb_no,yymm,yymm_2,idx_true_grade_class,idx_grade_class | idx_true_grade_class,idx_grade_class | 5,9     | NULL               | 16924 | Using sort_union(idx_true_grade_class,idx_grade_class); Using where |
     |  1 | SIMPLE      | a     | eq_ref      | PRIMARY                                                        | PRIMARY                              | 62      | shaklee_my.b.mb_no |     1 | Using where                                                         |
     +----+-------------+-------+-------------+----------------------------------------------------------------+--------------------------------------+---------+--------------------+------
    
  4. ==============================

    4.나이가 ANSI 구문은 WHERE 사실 그들이 조인, 실질적으로 동일 / ON은 새로운 ANSI의 syntac는이다. 모두 쿼리 엔진에 의해 인식

    나이가 ANSI 구문은 WHERE 사실 그들이 조인, 실질적으로 동일 / ON은 새로운 ANSI의 syntac는이다. 모두 쿼리 엔진에 의해 인식

  5. ==============================

    5.FROM 절에 쉼표는 CROSS 조인입니다. 우리는 SQL 서버가 어떻게 든과 같아야 선택 쿼리 실행 절차를 가지고 상상할 수 : 모든 테이블을 통해 1. 반복 처리 만나는 술어에 가입하고 결과 테이블에 그것을 넣어 2. 찾기 행. 결과 테이블에서 3. WHERE 조건을 충족하는 행만을 얻을.

    FROM 절에 쉼표는 CROSS 조인입니다. 우리는 SQL 서버가 어떻게 든과 같아야 선택 쿼리 실행 절차를 가지고 상상할 수 : 모든 테이블을 통해 1. 반복 처리 만나는 술어에 가입하고 결과 테이블에 그것을 넣어 2. 찾기 행. 결과 테이블에서 3. WHERE 조건을 충족하는 행만을 얻을.

    정말 모든 행이 조건이 검토된다 전에 서로 결합 될 때 다음, 십자가는 많은 메모리를 할당 할 수있는 몇 수천 행이 테이블에 가입하여, 그처럼 보이는 경우. 귀하의 SQL 서버는 매우 바쁜 될 수 있습니다.

  6. ==============================

    6.첫 번째 예는 명시 적으로 가입 할 곳을 열 가입 MySQL과 방법 두 번째 mysql을 시도하는 경우 그들과 합류하는 그림을 알려주기 때문에 나는 그렇게 생각한다.

    첫 번째 예는 명시 적으로 가입 할 곳을 열 가입 MySQL과 방법 두 번째 mysql을 시도하는 경우 그들과 합류하는 그림을 알려주기 때문에 나는 그렇게 생각한다.

  7. ==============================

    7.두 번째 쿼리는 내부 조인에 대한 또 다른 표기법, 그래서 하나 개의 쿼리를 빠르게 다른보다 구문 분석 할 수 때문이다 porformance에 차이가있는 경우 - 그 차이가 존재하는 경우, '당신이 원 너무 작은 것 t는 그것을 알 수 있습니다.

    두 번째 쿼리는 내부 조인에 대한 또 다른 표기법, 그래서 하나 개의 쿼리를 빠르게 다른보다 구문 분석 할 수 때문이다 porformance에 차이가있는 경우 - 그 차이가 존재하는 경우, '당신이 원 너무 작은 것 t는 그것을 알 수 있습니다.

    자세한 내용은이 질문에 대해 살펴을 시도 할 수 있습니다 (이미 응답되는 질문을하기 전에 SO 다음 번에 검색을 사용)

  8. ==============================

    8.첫 번째 쿼리는 실행 계획이 더 나은 것이라고 쿼리가 빠르게 실행 가능성이 높습니다 그래서 MySQL을 이해하기 쉽습니다.

    첫 번째 쿼리는 실행 계획이 더 나은 것이라고 쿼리가 빠르게 실행 가능성이 높습니다 그래서 MySQL을 이해하기 쉽습니다.

    where 절없이 두 번째 쿼리는 크로스 조인입니다. MySQL은 where 절 좋은를 충분히 이해할 수 있다면, 그것은 십자가의 모든 결합 행을 피하기 위해 최선을 다하지만 아무것도 보장됩니다.

    당신 간단 같은 경우, 성능은 엄격하게 동일합니다.

    성능 현명, 첫 번째 쿼리는 항상 두 번째 더 나은 또는 동일합니다. 그리고 내 관점에서 그것을 다시 읽는 경우 이해하는 것이 훨씬 더 쉽다.

  9. from https://stackoverflow.com/questions/5273942/mysql-inner-join-vs-where by cc-by-sa and MIT license