Maria db

30
㈜㈜㈜㈜㈜ MariaDB

description

Maria db

Transcript of Maria db

Page 1: Maria db

㈜유미테크

MariaDB

Page 2: Maria db

2

목차

1. MariaDB

2. 개요

3. 옵티마이저

4. 쿼리 작성 주의사항 및 최적화

5. 파티션 / 스토어드 프로시저

MariaDB

Page 3: Maria db

3

MariaDB

MariaDB

Page 4: Maria db

MariaDB4

MariaDB

• 개 발 자 : Monty Program Ab

• 발 표 일 : 2009-01-22

• 종 류 : 관계형 데이터베이스 관리시스템 (RDBMS)

• 운영체제 : 크로스 플랫폼 ( 윈도 , 리눅스 , 솔라리스 등 )

• 라이선스 : GPL V2 라이선스

• MySQL 과 동일한 소스코드 기반

• Oracle 의 MySQL 라이선스 반발에 의해 개발됨

MySQL MariaDB

5.1

5.1

5.2

5.3

5.5 5.5

5.6 10.0

Page 5: Maria db

5

1. 개요

MariaDB

1.1. 인덱스1.2. 함수1.3. 데이터타입

Page 6: Maria db

MariaDB6

1.1. 인덱스

• Index 생성시 Create Index 구문 또는 Alter table 구문을 사용

• Index 생성시 metadata lock 이 걸리며 이는 인덱스를 생성시 해당 테이블은 R/W lock 발생

• MariaDB 의 Index Type 은 BTREE, RTREE, HASH 타입 지원

• 인덱스 생성 예시 1

• 인덱스 생성 예시 2

Page 7: Maria db

MariaDB7

1.2. 함수

• 함수 특징

– 스토어드 함수 생성시 함수는 읽기 전용이므로 , IN 또는 OUT 파라미터 보유하지 않음

– 정의부에 반드시 Returns 키워드를 이용해 반환되는 값의 타입을 명시

• 함수 생성시 주의 사항

– 생성시 delimiter 명령어를 통해서 종료문자를 변경시킨 후 생성

– 민감한 정보를 저장하는 DB 보안을 위해 SQL SECURITY = INVOKER 로 사용 권장

Page 8: Maria db

MariaDB8

1.2. 함수

• 함수 생성 및 실행 예시

• 함수 생성 확인 예시

Page 9: Maria db

MariaDB9

1.3. 데이터 타입

• 숫자 타입

타입 MariaDB Size

Integer Type

BIGINT 8 bytes

DECIMAL(M,D)

DOUBLE 8 bytes

FLOAT 4 bytes

INT 4 bytes

INTEGER 4 bytes

MEDIUMINT 3 bytes

NUMERIC

REAL 8 bytes

SMALLINT 2 bytes

Page 10: Maria db

MariaDB10

1.3. 데이터 타입

• 문자 타입

• 주의 사항– TEXT, Blob 타입을 제외한 전체 칼럼의 크기는 65KB 를 초과할 수 없음 ( 다른 컬럼에서 40KB 를 사용하고 있다면 그 레코드의 VARCHAR 타입은 24KB 만

사용가능 )

– CHAR 또는 VARCHAR 뒤의 지정 숫자는 칼럼의 바이트가 아니라 문자의 수를 의미

타입 설명 예시

CHAR• 고정길이 칼럼 타입

• 0~255 byte 지원CHAR(10) : 10 개의 문자 저장

VARCHAR• 가변길이 칼럼 타입

• 0~65536 byte 지원VARCHAR(10) : 10 개의 문자 저장

Page 11: Maria db

MariaDB11

1.3. 데이터 타입

• 문자 집합 (Character_set)

Character_set 설명

Character_set_system MaraiDB 서버가 식별자를 저장할때 사용하는 문자집함

Character_set_server MariaDB 서버의 기본 문자집합

Character_set_database DB 생성시 기본 문자집함

Character_set_client Client 가 보낸 SQL 문장은 이 변수에 설정된 문자집합으로 인코딩해서 MariaDB 서버로 전송

Character_set_connection

Client 로부터 전달받은 SQL 문장을 처리하기 위해 이 변수값으로 문자집합을 변환

Character_set_results 쿼리 처리 결과를 Client 로 전송시 사용하는 문자집함

Page 12: Maria db

12

2. 옵티마이저

MariaDB

2.1 실행 계획 (explain)

Page 13: Maria db

MariaDB13

2.1. 실행 계획

• MariaDB 의 옵티마이저는 CBO(Cost-Based Optimizer) 방법으로 산출

• MariaDB 의 실행계획은 explain 명령어를 수행하면 확인 가능– MariaDB 의 옵티마이저는 시스템 테이블에 저장된 통계정보로 최적의 실행계획 산출

Page 14: Maria db

MariaDB14

2.1. 실행 계획

• 쿼리 실행이 좋은 경우

– Distinct

– Using Index

– Using Index for group-by

• 쿼리 실행이 나쁜 경우

– Using filesort

– Using join buffer

– Using temporary

– Using Where

Page 15: Maria db

15

3. 쿼리 작성 시 주의사항 및 최적화

MariaDB

3.1 Sub Query 사용 시 주의사항3.2 SQL Hint

3.3 쿼리 프로파일링

Page 16: Maria db

MariaDB16

3.1. Sub Query 사용시 주의사항

• 상관 서브 쿼리

– 외부에서 정의된 테이블의 칼럼을 조회해서 검색을 수행하는 쿼리

– 상관 서브쿼리는 독립적으로 실행되지 못하고 항상 외부쿼리가 실행된 후 그

결과값이 전달되어야 사용 가능

Page 17: Maria db

MariaDB17

3.1. Sub Query 사용시 주의사항

• Sub Query 제약 사항

– Sub Query 는 대부분 쿼리 문장에서 사용 가능

– LIMIT 절과 LOAD DATE INFILE 의 파일명에는 사용 불가

– IN 연산자 안에서 ORDER BY 와 LIMIT 을 동시 사용 불가

– FROM 절에서는 상관 서브쿼리 형태로 사용 불가

– 서브 쿼리를 이용해 하나의 테이블에 대해 읽고 쓰기를 동시 사용 불가

Page 18: Maria db

MariaDB18

3.1. Sub Query 사용시 주의사항

• MariaDB Sub Query 최적화– WHERE 절에 IN 연산자를 상수와 함께 사용할 때 동등 비교로 처리되므로

최적화 된 성능 보장

– WHERE 절에 IN 연산자를 서브쿼리를 사용하면 EXISTS 형태로 변환되어 상관 서브 쿼리 형태로 실행

– MariaDB 에서는 IN + Subquery 형태의 구문에 대해 최적화 실행중

Page 19: Maria db

MariaDB19

3.2. HINT

• SQL 문에 정보를 주어 SQL 문 실행에 빠른 결과를 가져오려는 것

• STRAIGHT JOIN HINT– 옵티마이저 실행 계획을 무시하고 테이블 순서 대로 JOIN

• USE INDEX– 가장 자주 사용되는 힌트로 옵티마이저에게 특정 테이블의 인덱스를

사용하도록 권장• FORCE INDEX

– USE INDEX 보다 옵티마이저에게 더 강한 영향을 주는 힌트• IGNORE INDEX

– 특정 인덱스를 사용하지 못하도록 옵티마이저를 유도

Page 20: Maria db

MariaDB20

3.2. HINT

• 쿼리 캐시 HINT

– MariaDB 는 쿼리 캐시를 사용할지 여부를 선택할수 있도록 힌트 제공

– SQL_CACHE

• Query_cache_type 이 1 또는 2 로 설정되어 있는 경우 쿼리 캐시를 사용

– SQL_NOCACHE

• 어떠한 경우에도 쿼리 캐시 사용 불가

Page 21: Maria db

MariaDB21

3.3. 쿼리 프로파일링

• MariaDB 는 쿼리가 처리되는 동안 각 단계별 작업 시간에 대한 통계정보 제공

• 쿼리 프로파일링 기능을 통해 쿼리의 성능을 예측

• 프로파일링 활성화– SET PROFILING=1 or 0 명령어를 이용하여 프로파일링 on/off 가능 (default : 0)

• 쿼리 실행 후 각 쿼리에 대한 프로파일 확인

– SHOW PROFILES / SHOW PROFILE

– SHOW PROFILE FOR QUERY < 쿼리번호 >

– SHOW PROFILE CPU FOR QUERY < 쿼리번호 >

– SHOW PROFILE SOURCE FOR QUERY < 쿼리번호 >

Page 22: Maria db

MariaDB22

3.3. 쿼리 프로파일링

• MariaDB 는 쿼리가 처리되는 동안 각 단계별 작업 시간에 대한 통계정보 제공

• 쿼리 프로파일링 기능을 통해 쿼리의 성능을 예측

• 프로파일링 활성화– SET PROFILING=1 or 0 명령어를 이용하여 프로파일링 on/off 가능 (default : 0)

• 쿼리 실행 후 각 쿼리에 대한 프로파일 확인

– SHOW PROFILES / SHOW PROFILE

– SHOW PROFILE FOR QUERY < 쿼리번호 >

– SHOW PROFILE CPU FOR QUERY < 쿼리번호 >

– SHOW PROFILE SOURCE FOR QUERY < 쿼리번호 >

Page 23: Maria db

MariaDB23

• 쿼리 프로파일링 활성화

• SHOW PROFILES 결과

3.3. 쿼리 프로파일링

Page 24: Maria db

MariaDB24

3.3. 쿼리 프로파일링

• SHOW PROFILE FOR QUERY 6

• SHOW PROFILE CPU FOR QUERY 6

Page 25: Maria db

25

4. 파티션 / 스토어드 프로시저

MariaDB

4.1 파티션4.2 스토어드 프로시저

Page 26: Maria db

MariaDB26

4.1. 파티션

• 파티션 특징

– MariaDB 에서 Partition 은 저장할 데이터를 분할하여 관리함으로써

보다 빠른 데이터처리 가능

– Partitioning 하지 않고 하나의 큰 테이블로 사용할 경우

그만큼 인덱스도 커지고 물리적인 공간도 많이 필요

– Partition 을 하게 되면 데이터와 인덱스를 조각화하여

물리적 공간을 효율적으로 사용 가능

• 파티션 장점

– 특정 데이터 집합의 추가 / 삭제가 간편

– 데이터 검색 시 특정 파티션만 읽어서 속도를 향상 가능

– 병렬처리가 가능

– 한 테이블에 너무 많은 데이터가 입력되었을 시 발생하는 속도 저하를 방지

Page 27: Maria db

MariaDB27

4.1. 파티션

• 파티션 사용시 주의사항

– 모든 파티션은 동일한 스토리지 엔진 사용

– 테이블과 인덱스를 별도로 파티션 불가 ( 테이블과 인덱스 같이 해야함 )

– 파티션 된 테이블은 foregin key 를 지원불가

– 파티션 된 테이블은 FullText Index 를 지원 불가

– 파티션 된 테이블은 Geometry 칼럼 타입 지원 불가

– 한 테이블당 파티션의 개수는 최대 1024 개

– Temp Table 은 파티션 사용 불가

– Partition 값은 반드시 정수형 타입

Page 28: Maria db

MariaDB28

4.1. 파티션

• MariaDB 파티션 종류

– Range Partitioning

• 파티션 키의 연속된 범위로 파티션을 정의

• 날짜 기반 데이터가 누적되고 년도 , 월 , 일 단위로 분석 , 삭제 할 경우

• 범위 기반으로 데이터를 여러 파티션에 균등하게 나눌 수 있을 경우

• 파티션 키 위주로 검색이 자주 실행 될 경우

• 예 ) 회원 가입 일자별로 분할 , 상품 판매 월별로 분할 등…

– List Partitioning

• 파티션 키 값이 코드 값이나 카테고리와 같이 고정 값일 경우

• 키 값이 연속적이지 않고 정렬순서와 관계없이 파티션을 해야 할 경우

• 파티션 키 값을 기준으로 레코드 건수가 균일하고 검색 조건에 파티션 키가 자주 사용 될 때

• 예 ) 회원 데이터를 지역별로 분할 , 판매 데이터를 매장별로 분할 등…

Page 29: Maria db

MariaDB29

4.1. 파티션

• MariaDB 파티션 종류

– Hash Partitioning

• Hash 함수에 의해 레코드가 저장될 파티션을 결정하는 방식

• Range, List 로 데이터를 균등하게 나누는 것이 어려울 때

• 테이블의 모든 레코드가 비슷한 사용 빈도를 보이지만

너무 커서 파티션 적용이 필요한 경우

• 예 ) 상품 주문 일련번호 등

– Key Partitioning

• Hash 파티션과 동일하지만 Hash 값을 계산하는 방법을 사용자가 지정 가능

• 키 파티션은 선정된 파티션 키 값에 대하여 내부적인 함수를 이용하여 Hash 값을 계산하고

그 값에 mod 를 적용하여 저장할 파티션을 결정

Page 30: Maria db

MariaDB30

4.2. 스토어드 프로시저

• MariaDB 의 스토어드 프로시저는 독립적으로 호출

• SELECT 나 UPDATE 등의 SQL 문장에서 스토어드 프로시저 참조 불가

• 스토어드 프로시저를 생성 시 주의 사항

– 생성시 DELIMITER 명령어를 통해서 종료문자를 변경시킨 후 생성

– 민감한 정보를 저장하는 DB 보안을 위해서 SQL SECURITY = INVOKER 로 사용

– 프로시저 생성시 가능하면 DETERMINISTIC 옵션을 정의

– 생성한 프로시저는 CALL 함수를 통해서 호출