반응형
세미 조인 (Semi Join)다른 테이블과 실제 조인을 수행하지는 않고, 단지 다른 테이블에서 조건이 일치하는 레코드가 있는지 없는지만체크하는 형태의 쿼리를 세미 조인이라고 한다.일반 조인과의 다른 점은 EXISTS나 IN 연산자를 서브쿼리와 함께 사용해서브쿼리의 조건을 만족하는 레코드는 가져오지 않고 만족하는지만 확인하는 것이다.-- IN을 사용한 세미 조인SELECT * FROM orders WHERE customer_id IN ( SELECT customer_id FROM customers WHERE country = 'KR');-- EXISTS를 사용한 세미 조인SELECT * FROM orders o WHERE EXISTS ( SELECT 1 FROM custo..
이번 포스팅에서는 쿼리 별로 JOIN이 어떻게 인덱스를 사용하는지에 대해 자세히 알아 볼 예정이다. 드라이빙 테이블과 드리븐 테이블설명하기 앞서 드라이빙 테이블과 드리븐 테이블을 이해할 필요가 있다. 드라이빙 테이블 (Driving Table)조인이 실행될 때 첫 번째로 액세스되는 테이블선행 테이블(Outer Table)이라고도 부름쿼리의 성능에 큰 영향을 미침일반적으로 더 작은 결과 집합을 반환하는 테이블이 드라이빙 테이블로 선택되는 것이 유리 드리븐 테이블 (Driven Table)드라이빙 테이블에서 읽힌 데이터를 기준으로 조인되는 테이블후행 테이블(Inner Table)이라고도 부름드라이빙 테이블의 각 레코드마다 접근됨 좀더 쉬운 이해를 위해 아래 쿼리를 살펴보자.SELECT *FROM employ..
DBMS 종류와 관계없이 기본적인 기능의 SQL 함수는 대부분 동일하게 제공되지만함수의 이름이나 사용법은 표준이 없어 DBMS 별로 거의 호환되지 않는다.MySQL에서는 어떤 함수를 제공하는지 한번 알아보자.NULL 값 비교 및 대체 (IFNULL, ISNULL)IFNULL()은 컬럼이나 표현식의 값이 NULL인지 비교하고, NULL이면 다른 값으로 대체하는 용도로 사용할 수 있다.첫 번째 인자는 NULL 비교 여부를 확인할 컬럼이나 표현식, 두 번째 인자는 NULL일 경우 대체할 값이나 컬럼을 설정한다.SELECT IFNULL(NULL, 1) -- 결과 : 1 ISNULL()은 인자러 전달한 표현식이나 컬럼의 값이 NULL인지 여부를 확인하는 함수이다.인자가 NULL이면 1(TRUE) 아니면 0(FAL..
이번 포스팅에서는 MySQL의 쿼리 작성법에 대한 기초와 연산자, 타입별 쿼리 작성법들에 대해 알아보고 주의사항도 추가로 알아볼 예정이다.참고로 ANSI 표준과 MySQL에서만 사용되는 ANSI 표준 형태가 아닌 연산자나 표기법을 함께 설명하지만가독성이나 높은 호환성 측면에서는 최대한 ANSI 표준을 따라는 것이 좋을 것이다.영어 대소문자 구분MySQL 서버는 DB나 테이블이 디스크의 디렉토리나 파일로 매핑되기 때문에설치된 운영체제에 따라 테이블명의 대소문자를 구분한다.윈도우에서는 MySQL이 대소문자를 구분하지 않지만 Unix 계열의 운영체제에서는 대소문자를 구분한다.따라서 윈도우에서 운영되던 데이터를 Unix 계열(Mac)로 가져오거나 그 반대의 경우 문제가 될 수 있다.MySQL 서버가 운영체제와 ..
클러스터링 인덱스 (Clustered Index)클러스터링에 대해 설명하기 앞서 Index Page에 대해 짚고 넘어가자.index page란?Index Page란 인덱스 트리의 각 노드에 해당되며, Key - Value로 키 값에 대한 데이터의 위치 정보를 갖고 있어DBMS가 테이블의 특정 행을 찾도록 도와준다. 클러스터링 인덱스는 기본적으로 테이블 당 1개만 생성가능하며, 실제 데이터 페이지가 정렬된 형태이다.PK가 클러스터링 인덱스로 구성되어 있고 UNIQUE 제약 조건과 NOT NULL 제약 조건을 가진 컬럼도 클러스터링 인덱스로 구분되지만 PK가 있다면 PK가 우선순위를 가진다.클러스터링 인덱스는 위와 같이 인덱스 페이지 안에 루트 노드와 리프 노드(데이터 페이지)가 들어가 있다.루트 노드에서 ..
어떤 경우에 인덱스를 사용하게 유도할지 말지를 판단하려면 어떻게 인덱스를 이용해서 실제 레코드를 읽는지 알 필요가 있다.MySQL이 인덱스를 이용하는 대표적인 3가지 방법을 알아보자. 인덱스 레인지 스캔가장 대표적인 인덱스 접근 방식으로 나머지 방법 중 가장 빠른 방법이다.인덱스 레인지 스캔은 검색해야 할 인덱스의 범위가 결정됐을 때 사용하는 방식이다. B-Tree 인덱스에서는 루트와 브랜치 노드를 이용해 스캔 시작 위치를 검색하고 그 지점부터 필요한 방향으로 인덱스를 읽어 나간다.인덱스 자체가 정렬되어 있기 때문에 이런 범위 검색 또한 빠르고 정렬된 상태로 레코드를 가져온다. 인덱스 레인지 스캔의 순서를 살펴보면 다음과 같다.인덱스에서 조건을 만족하는 값이 저장된 위치를 찾는다. (인덱스 탐색)1번에서..