MySQL
-
RDBMS - 식별관계, 비식별관계MySQL 2016. 12. 20. 22:29
Exerd를 보다가 문득 테이블간의 Cardinality를 표현하는 선이 점선, 실선으로 구분되는 것을 보고 무엇을 의미하는지 구글링 찾은 내용을 정리해본다. 식별관계 (실선) 부모 테이블(학과)의 유니크 키나 기본키로 지정된 컬럼(학과번호)이 자식 테이블(학과강의실)의 기본키 컬럼(학과번호)과 연결된 경우 실선으로 표기되고 식별 관계라고 한다 비식별관계 (점선) 부모 테이블(학과)의 유니크 키나 기본키로 지정된 칼럼(학과번호)이 자식테이블(학생)의 일반 컬럼과 연결된 경우 점선으로 표기되고 비식별 관계라고 한다. 부모 컬럼을 참조하는 자식 컬럼이 식별(PK) 가능하면 식별 관계라고 하고 식별이 가능하지 않으면 비식별 관계라고 한다. 즉, 자식 컬럼이 PK 인지 아닌지에 따라 식별 관계, 비식별 관계로 ..
-
Real MySQL [6-11] 실행계획 - 실행 계획 분석 시 주의 사항MySQL 2016. 12. 20. 21:58
본 게시물의 내용과 이미지는 도서 Real MySQL의 내용을 재구성하여 작성되었습니다. 저자, 출판사에 의해 저작권 문제 발생시 게시물이 비공개 될 수 있음을 알립니다. Select_type 칼럼의 주의 대상 DERIVED DERIVED는 FROM절에 사용된 서브 쿼리로부터 발생한 임시 테이블을 의미한다. 임시 테이블은 메모리에 저장될 수도 있고 디스크에 저장될 수도 있다. 일반적으로 메모리에 저장하는 경우에는 크게 성능에 영향을 미치지 않지만, 데이터의 크기가 커서 임시 테이블을 디스크에 저장하면 성능이 떨어진다. UNCACHEABLE SUBQUERY 쿼리의 FROM 절 이외의 부분에서 사용하는 서브 쿼리는 가능하면 MySQL 옵티마이저가 최대한 캐시되어 재사용될 수 있게 유도한다. 하지만 사용자 변..
-
Real MySQL [6-10] 실행계획 - 임시 테이블(Using temporary)MySQL 2016. 12. 19. 20:09
본 게시물의 내용과 이미지는 도서 Real MySQL의 내용을 재구성하여 작성되었습니다. 저자, 출판사에 의해 저작권 문제 발생시 게시물이 비공개 될 수 있음을 알립니다. 임시 테이블(Using temporary) MySQL 엔진이 스토리지 엔진으로부터 받아온 레코드를 정렬하거나 그룹핑 할 때는 내부적인 임시 테이블을 사용한다. "내부적"이라는 단어가 포함된 것은 여기서 이야기하는 임시 테이블이 CREATE TEMPORARY TABLE 로 만든 임시 테이블과 다르기 때문이다. MySQL 엔진이 사용하는 임시 테이블은 처음에는 메모리에 생성됐다가 테이블의 크기가 커지면 디스크로 옮겨진다. 원본 테이블의 스토리지 엔진과 관계없이 임시 테이블이 메모리를 사용할 때는 MEMORY 스토리지 엔진을 사용하며, 디스..
-
Real MySQL [6-9] 실행계획 - DISTINCTMySQL 2016. 12. 14. 21:29
본 게시물의 내용과 이미지는 도서 Real MySQL의 내용을 재구성하여 작성되었습니다. 저자, 출판사에 의해 저작권 문제 발생시 게시물이 비공개 될 수 있음을 알립니다. DISTINCT 특정 칼럼의 유니크한 값만을 조회하려면 SELECT 쿼리에 DISTINCT를 사용한다. DISTINCT는 MIN(), MAX() 또는 COUNT()와 같은 집합 함수와 함께 사용되는 경우와 집합 함수 없는 경우 두 가지로 구분된다. 집합 함수로 구분하는 이유는 DISTINCT 키워드가 영향을 미치는 범위가 달라지기 때문이다. 집합 함수와 같이 DISTINCT가 사용되는 쿼리의 실행계획에서 DISTINCT가 인덱스를 사용하지 못할 때는 항상 임시 테이블이 필요하다. 하지만 이런 경우 실행 계획 Extra 칼럼에 Using..
-
Real MySQL [6-8] 실행계획 - GROUP BYMySQL 2016. 12. 13. 23:29
본 게시물의 내용과 이미지는 도서 Real MySQL의 내용을 재구성하여 작성되었습니다. 저자, 출판사에 의해 저작권 문제 발생시 게시물이 비공개 될 수 있음을 알립니다. GROUP BY 처리 GROUP BY 또한 ORDER BY와 같이 쿼리가 스트리밍된 처리를 할 수 없게 하는 요소 중 하나다. GROUP BY 절이 있는 쿼리에서는 HAVING 절을 사용할 수 있는데 HAVING 절은 GROUP BY 결과에 대해 필터링 역할을 수행한다. 일반적으로 GROUP BY 처리 결과는 임시 테이블이나 버퍼에 존재하는 값을 필터링하는 역할을 수행한다. GROUP BY 에 사용된 조건은 인덱스를 사용해서 처리될 수 없으므로 HAVING 절을 튜닝하려고 인덱스를 생성하거나 다른 방법을 고민할 필요가 없다. GROUP..
-
Real MySQL [6-7] 실행계획 - ORDER BY 정렬 방식 성능 비교, 정렬 관련 상태 변수MySQL 2016. 12. 13. 21:57
본 게시물의 내용과 이미지는 도서 Real MySQL의 내용을 재구성하여 작성되었습니다. 저자, 출판사에 의해 저작권 문제 발생시 게시물이 비공개 될 수 있음을 알립니다. 정렬 방식의 성능 비교 웹 서비스용 쿼리에는 LIMIT가 필수적으로 사용되곤 한다. LIMIT는 테이블이나 처리 결과의 일부만 가져오기 때문에 MySQL 서버가 처리해야 할 작업량을 줄이는 역할을 한다. ORDER BY나 GROUP BY 같은 작업은 WHERE 조건을 만족하는 레코드를 LIMIT 건수만큼만 가져와서 처리될 수 없다. WHERE 조건이 인덱스를 잘 활용하도록 튜닝해도 잘못된 ORDER BY나 GROUP BY 때문에 쿼리가 느려지는 경우가 자주 발생한다. 쿼리에서 인덱스를 사용하지 못하는 정렬이나 그룹핑 작업이 왜 느리게 ..
-
Real MySQL [6-6] 실행계획 - 풀 테이블 스캔, ORDER BY (Filesort)MySQL 2016. 12. 13. 21:23
본 게시물의 내용과 이미지는 도서 Real MySQL의 내용을 재구성하여 작성되었습니다. 저자, 출판사에 의해 저작권 문제 발생시 게시물이 비공개 될 수 있음을 알립니다. MySQL 주요 처리방식 이번 포스팅에서는 성능에 미치는 영향이 큰 실행 계획과 연관이 있는 단위 작업에 대해 살펴보고자 한다. 설명하는 내용중 풀 테이블 스캔을 제외한 나머지는 모두 스토리지 엔진이 아니라 MySQL 엔진에서 처리되는 내용이다. 또한 MySQL 엔진에서 부가적으로 처리하는 작업은 대부분 성능에 미치는 영향이 큰데, 모두 쿼리의 성능을 저하시키는 데 한몫을 하는 작업들이다. MySQL 엔진에서 처리하는 데 시간이 오래 걸리는 작업의 원리를 알아둔다면 쿼리를 튜닝하는데 상당히 많은 도움이 될 것이다. 풀 테이블 스캔 인덱..
-
Real MySQL [6-5] 실행계획 - EXPLAIN EXTENDED, PARTITIONSMySQL 2016. 12. 13. 20:12
본 게시물의 내용과 이미지는 도서 Real MySQL의 내용을 재구성하여 작성되었습니다. 저자, 출판사에 의해 저작권 문제 발생시 게시물이 비공개 될 수 있음을 알립니다. EXPLAIN EXTENDED(Filtered 칼럼) 스토리지 엔진에서 최종적으로 사용자에게 전달되는 레코드를 MySQL에서 필터링 한다. 이 과정에서 버려지는 레코드가 발생할 수 있는데 필터링이 얼마나 효율적으로 실행됬는지를 Filtered 칼럼으로 알 수 있다. 실행계획에서 Filtered 칼럼을 함께 조회하려면 EXPLAIN 명령 뒤에 "EXTENDED"라는 키워드를 지정하면 된다. "EXTENDED" 키워드가 사용된 실행 계획 예제를 살펴보자. EXPLAIN EXTENDED SELECT * FROM employees WHERE ..