반응형
서브쿼리는 쿼리의 여러 위치에서 사용할 수 있는데대표적으로 SELECT, FROM, WHERE 절에 사용될 수 있다.하지만 사용되는 위치에 따라 쿼리의 성능 영향도와 MySQL 서버의 최적화 방법은 완전히 달라진다.각 절마다 어떻게 최적화되는지 그리고 어떻게 쿼리를 작성해야 성능에 도움이 될지 살펴보자.SELECT 절에 사용된 서브쿼리SELECT 절에 사용된 서브쿼리는 내부적으로 임시 테이블을 만들지도 않고 비효율적으로 실행하지 않기 때문에서브쿼리가 인덱스만 적절히 사용한다면 크게 주의할 사항은 없다.(단, 상관 서브쿼리의 경우 다름) 일반적으로 SELECT 절에 서브쿼리를 사용하면 그 서브쿼리는 항상 컬럼과 레코드가 하나인 결과를 반환해야 한다.즉, 값이 NULL이든 아니든 관계 없이 레코드가 딱 1건..
많은 서비스들이 독립적인 기능을 수행하는 작은 단위의 서비스들로 구성된 MSA로 구축하면서서비스의 복잡도를 줄이고, 변경에 따른 영향을 최소화하고 작은 서비스별로 업무를 맡아 개발/배포를 하고 있다.하지만 이 작은 서비스들이 무수히 많아진다면 각 서비스들의 엔드포인트를 관리하기 쉽지 않을 것이다.또한 각 서비스마다 공통으로 들어가는 인증, 로깅같은 기능들을 중복으로 개발해야한다는 문제점도 있다.이러한 문제점을 해결하기 위해 등장한 것이 바로 API Gateway이다. API Gateway는 위 이미지와 같이 클라이언트와 각각의 서비스들 사이에 위치하게 된다. 클라이언트는 각 서비스의 엔드포인트 대신 API Gateway로 요청을 보내고요청을 받은 API Gateway는 라우팅 규칙에 따라 각 엔드포인트로..
세미 조인 (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 서버가 운영체제와 ..