mysql 8

MYSQL Partition 파티션 키와 테이블

파티션 partition 파티션이란, 하나의 테이블에 데이터가 많을 때, 특정 칼럼을 기준으로 분할하는 것을 말합니다. row을 그룹핑하여 분할하는 것을 수평적 분할(horizontal partitioning)이라고 합니다. 파티션 종류 범위(Range) 파티셔닝 칼럼 1개를 기준으로 범위조건 (less than)을 이용해 파티셔닝 하는 것을 의미합니다. 예를 들어 날짜가 2021.01.01~2021.01.31인 데이터와 2021.02.01~2021.02.28 데이터로 분리하는 것을 의미합니다. 범위조건 칼럼으로는 INT만 사용 가능합니다. DATE, DATETIME 등을 사용하려면 INTEGER로 변환하여 사용하여야 합니다. (ex) YEAR(date) CREATE TABLE employees ( id..

DB/SQL 2021.12.08

MySQL : Foreign keys are not yet supported in conjunction with partitioning

테이블 파티셔닝을 처리하려고 할 때 FK가 있으면 발생하는 에러입니다. FK 제약조건을 삭제 후 파티셔닝을 수행하면 됩니다. [fk 제약조건 삭제] SHOW CREATE TABLE SALARIES; ALTER TABLE SALARIES DROP CONSTRAINT salaries_ibfk_1 ; 파티셔닝 수행 후 FK 제약조건 추가 ALTER TABLE SALARIES ADD CONSTRAINT salaries_ibfk_1 foreign key(emp_no) references employees (emp_no) on update cascade ;

기타/에러처리 2021.10.11

MySQL 튜닝 : 적합한 인덱스 생성하기

Case 1 : 적합한 인덱스가 없을 때 다음은 이름이 Badri 인 사원을 검색하는 쿼리입니다. 먼저 적합한 인덱스가 없어 테이블 전체 299335건을 탐색했습니다(type : ALL). 그리고 나서 where 조건을 이용해10%만 걸러내었습니다. ( filtered : 10.00, Extra Using where) SELECT E.EMP_NO FROM employees E WHERE E.FIRST_NAME = 'Badri'; 실제 저 쿼리 결과로 검색되는 데이터의 건수는 227건입니다. 전체 중 227건을 추출하기 위해 테이블 전체를 스캔하는 것은 비효율적입니다. 그래서 first_name을 구성 칼럼으로 가지는 인덱스를 추가해주었습니다. alter table employees add index id..

DB/SQL 2021.10.11

MySQL 쿼리 정리

테스트 데이터 만들기 테이블 생성 CREATE TABLE CREATE TABLE T ( ID INT PRIMARY KEY, A INT, B INT, C INT, TYPE CHAR(2) ); 인덱스 생성 CREATE INDEX CREATE INDEX IDX_1 ON T(B,A); PL/SQL로 데이터 만들기 DELIMITER $$ -- 프로시저 INSERTDATA 선언 시작 CREATE PROCEDURE INSERTDATA() BEGIN DECLARE id INT; -- 증가 변수 ID 선언 SET id = 1;-- 변수 ID의 초기값 선언 WHILE id < 100 DO -- 변수 ID의 값이 100보다 작은 경우 루프 실행 INSERT T VALUES( id, id/10, id/100, id/1000,..

DB/SQL 2021.10.10

MYSQL SELECT 튜닝

인데스 칼럼의 변형 제거하기 다음처럼 WHERE 조건에서 인덱스 칼럼 값에 변형이 가해진 경우는 인덱스를 사용하지 못해 비효율적입니다. 인덱스 칼럼에 변형을 제거해주어야 합니다. [튜닝 전] SELECT A, B, C FROM T WHERE PK1/100 = 1; [튜닝 후] SELECT A, B, C WHERE PK1 BETWEEN 100 AND 199; 다음은 WHERE 조건에서 인덱스 칼럼 2개를 합쳐서 사용한 경우입니다. 이도 마찬가지로 인덱스 칼럼에 변형이 가해졌기 때문에 인덱스를 사용하지 못해 비효율적입니다. [튜닝 전] SELECT A, B, C FROM TABLE WHERE CONCAT(A,B) = '202107'; [튜닝 후] SELECT A, B, C FROM TABLE A = '202..

DB/SQL 2021.10.10

MySQL 데이터 타입 Data Types

숫자 Numeric Data Types DataType 범위 BIT 1 to 64 2^6 TINYINT -128 to 127. 2^7 BOOL, BOOLEAN 0 은 true, 0이 아니면 false SMALLINT -32768 to 32767. 2^16 MEDIUMINT -8388608 to 8388607. 2^24 INT -2147483648 to 2147483647. 2^32 BIGINT -9223372036854775808 to 9223372036854775807. 2^64 DECIMAL(M,D) M인 자연수, D는 소숫점 표현으로 M은 65자리, D는 30자리까지 표현 가능 FLOAT(M,D) -3.402823466E+38 to -1.175494351E-38, 0, and 1.175494351E..

DB/SQL 2021.10.10

MYSQL 실행계획 EXPLAIN

EXPLAIN 실행계획 출력 항목 항목 설명 ID The SELECT identifier SELECT 문 실행 순서 SELECT_TYPE The SELECT type SELECT 유형 TABLE The table for the output row PARTITIONS The matching partitions 테이블 파티션을 나타내는 정보로, NULL이면 파티션 테이블이 아님. TYPE The join type 테이블의 데이터를 어떻게 찾을지에 대한 정보, 테이블 전체를 탐색하는지, 인덱스를 이용해 탐색하는 지에 대한 정보를 알 수 있음. POSSIBLE_KEYS The possible indexes to choose 사용할 수 있는 인덱스 후보군 KEY The index actually chosen 실제..

DB/SQL 2021.10.08

MYSQL 힌트

힌트 RDBMS가 효율적으로 데이터를 찾을 수 있도록 추가적인 정보를 제공하기 위한 것. 특정 인덱스를 사용하게 한다던가, 특정 조인 방식으로 유도하는 식으로 사용한다. 힌트 작성법 ① 주석 표기를 이용 SELECT COLUMNA, COLUMNB FROM TALBE /*! USE INDEX (INDEX_NAME) */ WHERE COLUMNA = 'A' ② 쿼리의 일부로 작성 SELECT COLUMNA, COLUMNB FROM TALBE USE INDEX (INDEX_NAME) WHERE COLUMNA = 'A' 힌트 사용시 주의사항 MYSQL은 힌트를 작성하더라고 옵티마이저가 힌트를 따르는 것이 비효율적이라고 생각하면 무시된다. 힌트에 사용된 오브젝트(인덱스, 함수)가 존재하지 않으면 에러가 발생한다...

DB/SQL 2021.10.07