이 글에서는mysql에 대한 관련 지식을 제공합니다. 이 글에서는 주로 Left Join, Right Join, Inner Join 및 Hash Join의 작동 원리를 소개하고 하위 쿼리와 조인의 차이점을 분석하며 학습한 내용을 바탕으로 몇 가지 정보를 제공합니다. . 직장에서 익혀야 할 실무 능력을 살펴보겠습니다. 모두에게 도움이 되기를 바랍니다.
추천 학습:mysql 동영상 튜토리얼
여러 테이블에 인덱스를 생성하고, 다중 테이블 JOIN 및 하위 쿼리 문은 상대적으로 어렵습니다. 많은 개발자들은 JOIN이 SQL의 성능 효율성을 감소시킬 것이라고 무의식적으로 믿고 있으므로 다중 테이블 SQL을 단일 테이블 쿼리로 분할합니다. 개발자가 JOIN 구현 프로세스를 이해하지 못하기 때문에 이것이 SQL 실행 효율성에 영향을 미칠 것이라고 생각합니다.
테이블 R과 S가 조인되었다고 가정하면 조인 간의 테이블 연결은 일치를 위해 인덱스를 사용합니다.
테이블 R을 구동 테이블이라고 합니다. 테이블 R의 WHERE 조건으로 필터링된 데이터는 테이블 S의 해당 인덱스에 하나씩 쿼리됩니다. 테이블 R을 구동하는 데이터의 양이 많지 않다면 위의 알고리즘은 매우 효과적이다.
다음 세 가지 JOIN 유형 각각에 대한 구동 테이블은 무엇입니까?
SELECT * FROM R LEFT JOIN S ON R.x = S.x WEHRE ... SELECT * FROM R RIGHT JOIN S ON R.x = S.x WEHRE ... SELECT * FROM R INNER JOIN S ON R.x = S.x WEHRE ...
INNER JOIN의 경우 구동 테이블은 테이블 R 또는 테이블 S일 수 있습니다. 왼쪽과 오른쪽이 공유하는 데이터를 표시합니다.
이 시나리오에서는 더 적은 양의 데이터를 쿼리해야 하는 사람이 테이블을 주도하게 됩니다. 다음 예를 살펴보겠습니다.
SELECT * FROM R INNER JOIN S ON R.x = S.x WHERE R.y = ? AND S.z = ?
위 Left Join의 경우 구동 테이블은 Right Join의 왼쪽 테이블 R이고 구동 테이블은 오른쪽 테이블 S입니다. 왼쪽 테이블의 데이터를 쿼리해야 하는지, 오른쪽 테이블의 데이터를 쿼리해야 하는지를 결정하는 JOIN 타입입니다.
왼쪽 테이블의 모든 레코드를 반환하고 오른쪽 테이블의 동일 조인 필드가 있는 레코드를 반환합니다. 오른쪽 테이블에 일치하는 항목이 없더라도 왼쪽 테이블의 모든 행을 반환합니다.
SELECT * FROM R LEFT JOIN S ON R.x = S.x WHERE R.y = ? AND S.z = ?
위 Left Join의 경우 구동 테이블은 Right Join의 왼쪽 테이블 R이고, 구동 테이블은 오른쪽 테이블 S입니다. 왼쪽 테이블의 데이터를 쿼리해야 하는지, 오른쪽 테이블의 데이터를 쿼리해야 하는지를 결정하는 JOIN 타입입니다.
오른쪽 테이블의 모든 레코드와 왼쪽 테이블의 동일 조인 필드가 있는 레코드를 반환합니다. 왼쪽 테이블에 일치하는 항목이 없더라도 오른쪽 테이블의 모든 행을 반환합니다.
SELECT * FROM R RIGHT JOIN S ON R.x = S.x WHERE R.y = ? AND S.z = ?
MySQL의 두 번째 JOIN은 두 테이블 간의 연결 조건에 인덱스가 없을 때 사용되는 Hash JOIN입니다. 연산.
연결이 없으면 인덱스를 만들어도 괜찮나요?
일부 열이 선택도가 낮은 인덱스인 경우 데이터를 가져오기 위해 인덱스를 생성할 때 데이터를 정렬해야 하며, 이는 가져오기 성능에 영향을 미치며 테이블을 반환하는 데 문제가 발생합니다. 필터링된 데이터의 양이 많은 경우 직접 전체 테이블 스캔이 더 빨라집니다.
OLAP 비즈니스 쿼리(OLAP은온라인 분석 처리,데이터 분석에 사용이며 여러 데이터베이스 시스템의 정보를 동시에 분석할 수 있음)의 경우 해시 조인은 필수 기능입니다. MySQL 8.0은 Hash Join 알고리즘 지원을 시작하여 OLAP 비즈니스에 대한 지원을 강화합니다.
따라서 쿼리하는 데이터의 양이 너무 크지 않고 쿼리의 응답 시간이 분 단위로 필요한 경우 MySQL 8.0의 단일 인스턴스를 사용하여 빅 데이터 쿼리를 완료할 수 있습니다.
Hash JOIN은 MySQL 8.0의 실행 계획에 나타납니다. 먼저, 드라이브 테이블을 스캔하는 과정에서 해시 테이블이 생성됩니다. 두 번째 테이블을 스캔하면 연관된 각 레코드가 해시 테이블에서 검색됩니다. 발견되면 기록이 반환됩니다.
해시 조인 선택 드라이버 테이블과 중첩 루프 조인 알고리즘은 기본적으로 동일합니다. 두 작은 테이블 모두 드라이버 테이블로 사용됩니다. 드라이버 테이블이 크고 생성된 해시 테이블이 메모리 크기를 초과하면 MySQL은 자동으로 결과를 디스크에 덤프합니다.
저를 포함한 상당수의 개발 학생들이 전통적인 JOIN 문 대신 하위 쿼리 작성을 선호한다는 것을 알았습니다.
하위 쿼리의 논리는 매우 명확합니다. JOIN도 이러한 요구를 충족시킬 수 있지만 LEFT JOIN은 대수적 관계이고 하위 쿼리는 인간 사고의 관점에서 이해하려는 경향이 더 많기 때문에 이해하기 쉽지 않습니다.
그러나 MySQL 8.0에서는 최적화 프로그램이 자동으로 하위 쿼리를 JOIN 실행 계획으로 최적화하여 성능을 크게 향상시킵니다.
SQL 실행 계획에만 집중하면 됩니다. 두 실행 계획이 동일하다면 성능에는 차이가 없습니다.
MySQL 8.0 이전에는 MySQL이 하위 쿼리를 완전히 최적화하지 못했습니다. 따라서 하위 쿼리의 실행 계획에 DEPENDENT SUBQUERY 힌트가 표시됩니다. 이는 하위 쿼리가 종속 하위 쿼리이고 하위 쿼리가 외부 테이블의 연결에 의존해야 함을 나타냅니다. DEPENDENT SUBQUERY는 수행 속도가 매우 느릴 수 있으며 대부분의 경우 두 테이블 간의 조인으로 수동으로 변환해야 합니다.
그래서 블로거는팁여러분, 현재 MySQL 8.0 버전이 하위 쿼리를 작성할 수 있다면 하위 쿼리 최적화가 상당히 완료되었기 때문입니다.
MySQL 8.0 이전 버전의 경우 모든 하위 쿼리 계획의 SQL 실행을 확인해야 합니다. . DEPENDENT SUBQUERY에 대한 팁은 최적화되어야 합니다. 그렇지 않으면 비즈니스에 상당한 성능 영향을 미치게 됩니다. DEPENDENT SUBQUERY의 최적화는 일반적으로 테이블 조인을 위한 파생 테이블로 다시 작성됩니다.
추천 학습:mysql 비디오 튜토리얼
위 내용은 MySQL 원칙 요약: 왼쪽 조인, 오른쪽 조인, 내부 조인 및 해시 조인의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!