MySQL 15

Mysql 인덱스 사용법 및 실행 계획 정리

mysql 인덱스에 대한 정확한 이해도 없이 사용을 하다보니 조금 개념적으로 헷갈리는게 많이 있었다. 이 부분에 대해 한번 정리하고 넘어가고자 기록해본다. 인덱스 인덱스는 빠르게 특별한 컬럼과 함께 값을 찾는데 사용된다. 인덱스가 없으면 Mysql은 처음 행부터 전체 테이블을 읽어 들여서 데이터를 찾는다. 거대한 테이블에서 이런 행동은 비용이 상당히 많이 들어가게 된다. 만약에 테이블이 인덱스를 가지고 있으면 빠르게 접근할 수 있게 된다. 대부분의 Mysql 인덱스 (PRIMARY KEY, UNIQUE, INDEX, and FULLTEXT)는 B-tree안에 저장된다. 예외적으로 spatial 데이터 타입은 R-tree를 사용, 메모리 테이블은 또한 hash index를 지원, InnoDB는 FULLTE..

Junit5 Test Container사용하여 테스트 환경 구축하기 (인프런 백기선님 강의 정리)

도커와 테스트 (TestContainers) 테스트를 위해서는 운영과 동일한 형태의 개발 환경에서 테스트 하는 것이 중요하다. 하지만 매번 동일하게 환경을 구축할 수 없고 모든 개발 자들과 같은 환경을 맞추기도 쉽지 않다. 그래서 Docker를 이용해서 테스트마다 테스트를 위한 컨테이너를 실행시켜서 테스트하고 컨테이너를 제거해주면 좋은데 그런 기능을 TestContainer를 이용해서 가능하다. 실제로 이번에 이직한 회사에서 동일하게 테스트 환경을 사용하는 것을 봤다. 막연하게 그 기능을 사용할 수 있었지만 이번 Junit5 백기선님 강의를 들어서 확실하게 정리할 수 있어서 좋았다. 역시 듣길 잘했다. 꼭 들어보길 강추한다. 그럼 그 내용을 정리해보자. 테스트 컨테이너(Test Container) 라이브..

web/Junit 2019.12.26

[공유] mysql/mariadb utf8mb4 언어셋 설명

mysql 을 사용하다보면 utf8 캐릭터 셋을 자주 사용한다. 그 중에서도 여러 패키지가 존재하는데 잘 알지 못하고 사용하는 것 같다. 주로 사용하는 캐릭터 셋을 정리된 글을 공유해본다. 핵심 부분만 정리했다. 자세한 내용은 아래 출저 페이지에가서 보면 좋은 공부가 될 것 같다. - Mysql에서 주로 보는 Charset과 collection이 있는데 각각 문자집합과 정렬을 뜻한다.- utf8은 1 ~ 4 바이트까지 저장할 수 있도록 설계된 가변 바이트 자료형이다.- Mysql에서는 utf8을 3바이트 가변 자료형으로 저장한다. (chraset: utf8, collation: utf8_general_ci)- emoji와 같은 문자는 4바이트이기 때문에 해당 필드에 저장하면 문제 발생- Mysql 5.5..

Spring boot hibernate jpa에서 Auditing 사용 - update, create 시간 자동 변경

엔티티를 만들고 데이터를 삽입하고 조작할 때 create date와 last modified date를 별도로 업데이트 해주면서 관리하였다. 하지만 이번에 JPA를 공부하면서 별도의 작업 없이 JPA의 Auditing 기능을 사용하면 데이터를 삽입하고 수정할 때 자동으로 날짜를 수정하도록 할 수 있는 기능이 있는 것을 확인했다. 1. ConfigurationJPA Auditing을 사용하기 위해서는 기능을 자동으로 활성화 해주는 어노테이션을 붙혀주면 된다. 처음에는 @Configuration을 사용하는 클래스에 함께 선언해주었는데 정상적으로 적용이 되지 않아서 @SpringBootApplication을 사용하는 곳에 적용했더니 성공적으로 적용되었다. 123456789101112131415161718192..

web/Spring 2018.10.03 (2)

Mysql 묵시적 형변환

묵시적 형변환 조건절의 데이터 타입이 다를 때 우선순위가 높은 타입으로 형이 내부적으로 변환 되는 것. 정수 > 문자열 순이며 만약 정수와 문자열이 비교가 되는 경우에는 둘중에 우선순위가 낮은 것이 변경된다. 우리는 이렇게 자동으로 형변환 해주는 경우에 익숙해져 있다. 자바에서도 Integer와 int 두 개의 변수의 값을 묵시적으로 형변환 시켜주지만 이는 이펙티브 자바 책에서도 볼 수 있지만 성능저하의 원인이 된다고 한다. Mysql도 예외가 아닌 것 같다. 예를 들어 보자 아래와 같은 테이블을 생성 후 데이터를 삽입한다. 1234567891011121314151617181920212223# 테이블 생성 create table chagne_data ( id int unsigned not null aut..

Mysql 실행계획 설명

프로그램의 성능을 높히기 위해서는 DB튜닝이 필요하다. Mysql에서 튜닝을 하기 위해서 제공하는 쿼리의 실행 계획에 대해 정리해보자. Mysql의 데이터 처리 방식우선 Mysql의 데이터 처리방식에 대해 정리해보자. - Mysql은 단일 코어로 데이터를 처리하기 때문에 멀티코어로 scale out을 진행하는 것 보다 cpu 자체의 성능을 높히는 scale up을 하는 것이 더 효율적이다. - Oracle과 달리 mysql은 nested loop join 알고리즘만 사용한다. - Nested Loop Join은 선행 테이블의 검색 결과 값 하나하나 테이블 B와 조인하는 방식이다. 그래서 데이터 양이 적을 때는 상관이 없으나 데이터가 많은 테이블끼리 조인할 시 성능에 문제가 있을 수 있다. 그래서 내부적으..

Mysql Exists와 IN절 설명과 차이점

두 개 모두 where절에 조건을 보고 결과를 걸러낼때 사용하는데 정리가 잘 안되서 정리해봤다. Exists 서브쿼리가 반화나는 결과값이 있는지를 조사한다. 단지 반환된 행이 있는지 없는지만 보고 값이 있으면 참 없으면 거짓을 반환한다.1SELECT * FROM sample1;cs1SELECT * FROM sample2;cs 두 개의 테이블중 조건에 맞는 Row만 추출된다. 1SELECT * FROM sample1 s1 WHERE EXISTS(SELECT * FROM sample2 s2 WHERE s1.no = s2.no);cs그럼 반대로 조건에 맞지 않는 ROW만 추출하고 싶으면 어떻게 해야할까?1SELECT * FROM sample1 s1 WHERE NOT EXISTS(SELECT * FROM sam..

Mysql의 서버엔진과 스토리지 엔진

Mysql에는 두 가지 형태의 엔진이 존재한다. 아래 그림에서 보면 하단에 길게 표시된 Pluggable 스토리지 엔진을 제외하고 위에 모든 부분이 서버엔진이다. 엔진별 특징 정리서버엔진 (SQL Interface, Parser, Optimizer, Cache & Buffer) - 클라이언트의 요청을 받아 SQL을 처리하는 DB 자체의 기능적인 역할을 수행 - DB가 SQL을 이해할 수 있도록 쿼리를 파싱하고 메모리, 물리적 저장장치와 통신하는 기능을 수행 - 디스크와 직접적인 접근을 제외한 대부분의 역할 수행 스토리지 엔진 - 서버 엔진이 필요한 데이터를 물리적 장치에서 가지고 오는 역할을 수행 - 물리적 저장장치에서 데이터를 읽어오는 역할을 수행하고 플러그인 형식으로 여러 스토리지 엔진을 필요에 따라..

Mysql에서 각 유형별 상위 몇건 데이터 가져오는 방법

Mysql을 공부하면서 특정 컬럼을 그룹으로 나누고 그 그룹별로 상위 N건의 데이터를 출력하는 방법에 대해 알아보았다. MySQL은 Oracle의 그룹별로 시퀀스 번호를 할당하는 ROW_NUMBER()라는 기능이 제공되지 않아 상위 몇개의 데이터를 추출하기 위해서는 Mysql의 세션 변수를 사용하여 구현할 수 있다. 우선 두 개의 테이블이 존재한다고 가정해보자. 첫 번째 테이블은 사용자 정보를 담고 있는 user 테이블이고 두 번째 테이블은 사용자별 구매정보를 가지고 있는 purchase 테이블이 있다고 가정해보자. user 테이블 purchase 테이블 이 때 사용자 ID가 2보다 큰 사용자들을 대상으로 마지막 구매날짜가 최신인 상위 탑 7개를 추출하는 쿼리를 작성해보자. 결론부터 보여주면 다음과 같다..

Mysql @variables를 통해 변수 생성 및 대입 연산자 소개

mysql에서 사용자 정의변수로서 @variables를 사용할 수 있다. 예를 들면 다음과 같이 set 명령어를 통해 변수를 만들고 값을 부여한뒤, 해당 변수를 여러 부분에서 사용할 수 있다.12SET @a = 'test';SELECT @a;cs 해당 변수의 유효 범위는 데이터베이스와의 세션이 유효할때까지 사용이 가능하다. 그럼 변수의 데이터를 대입할때 사용하는 대입 연산자에 대해 알아보자. 대입 연산자설명=왼쪽 피연산자에 오른쪽 피연산자를 대입함. (SET 문이나 UPDATE 문의 SET 절에서만 대입연산자로 사용됨):=왼쪽 피연산자에 오른쪽 피연산자를 대입함. = 연산자는 Mysql에서 SET이나 UPDATE 문장에서 왼쪽연산자에 오른쪽 연산자를 대입하는 의미로 사용된다. 그 이외에 사용될 때는 비교..