DB 15

MySQL 실행 계획

MySQL 통계 정보 이용하기 1. 히스토그램 8.0 이상 버전 부터 사용할 수 있는 통계 정보. 쿼리의 실행 계획을 세우는데 도움을 준다. 컬럼 단위로 수집되며 ANALYZE TABLE ... UPDATE HISTOGRAM 명령을 실행해 수동으로 수집 및 관리된다. 예시) ANALYZE TABLE employees.employees UPDATE HISTOGRAM ON gender, hire_date; SELECT * FROM information_schema.COLUMN_STATISTICS WHERE SCHEMA_NAME='employees' AND TABLE_NAME='employees'; gender 컬럼에 생성된 히스토그램 내용 {"buckets": [[1, 0.6000515237677232], ..

DB/MySQL 2022.06.12

MySQL 옵티마이저와 힌트

옵티마이저 쿼리를 실행하기전 어떻게 실행할 것인지, 최적의 실행 계획을 만들기 위한 논리를 만드는 역할 쿼리 실행 절차 1. 사용자의 SQL 문장를 MySQL 서버가 이해할 수 있는 수준으로 분리한다. 2. 분리된 파스 트리 정보를 보고 어떤 테이블, 인덱스를 읽을 것인지 확인한다. 3. 결정된 테이블 읽기 순서나 대상 인덱스를 사용하여 데이터를 읽는다. - 파스 트리 정보으로부터 결정하는 것 불필요한 조건 제거, 복잡한 연산 단순화, 읽는 테이블 순서 결정, 인덱스 통계 정보를 이용하여 인덱스 결정, 레코드를 임시 테이블을 만들어 다시 가공해야하는 지 결정 등. 기본 데이터 처리 - 풀 테이블 스캔 인덱스를 사용하지 않고 전체 데이터를 처음부터 끝까지 읽어 요청된 작업을 처리하는 것 1. 레코드 건 수..

DB/MySQL 2022.05.08

RDBMS vs NoSQL

Relational DBMS 관계형 데이터 베이스로 객체를 나타내는 각 테이블의 관계로 정의되는 데이터 모델링 기법을 사용한다. RDBMS에서 사용하는 테이블은 고정된 스키마가 존재하며 SQL 언어를 사용하여 데이터를 조작하고 ACID 특성을 보자한다. NoSQL 고성능의 비관계적 데이터를 지향하기 위해 고안되었다. 빅데이터 등으로 저장해야하는 데이터 양이 늘어나자 수평적 확장에 대한 유연함이 요구 되었고 기존 관계형 데이터 베이스에서 고정된 스키마의 변경의 어려움을 극복하고자 하였다. 관계형 테이블을 만들지 않고 모든 데이터를 한 형식, Key-Value Pair 혹은 JSON document 등으로 저장하는 방식을 택한다. 따라서 테이블 JOIN이 필요없게 되었다. 대신 기존 관계형 테이블에서 무결성..

DB/이론 2022.05.02

무결성 제약 조건

무결성 제약 조건 (Intergrity Constraint) 관계형 데이터 베이스에서 데이터 무결성을 지키기 위한 제한된 조건을 의미한다. 입력, 삭제, 갱신하는 경우 항상 무결성 제약 조건을 만족할 때만 실행하도록 허용한다. 종류 설명 도메인 제약조건 속성의 자료 값은 항상 도메인의 원자값을 가져야한다. 개체 무결성 제약조건 속성은 null이 아니고 중복이 불가능하다. 키 제약조건 키 값은 유일하게 튜플을 식별해야한다. 참조 무결성 제약조건 외부키 값은 반드시 기본키의 도메인 값이어야 한다. 의미 무결성 제약 조건 조건을 명시한 제약조건은 지켜야한다. MySQL 에서 제공하는 제약조건 기본 키 제약 조건 PRIMARY KEY 기본 키 제약 조건에 해당하는 경우 해당 속성의 값은 중복을 허용하지않고 NU..

DB/이론 2022.05.02

MySQL MVCC - 멀티 버전 동시성 제어

MVCC (Multi Version Concurreny Control) 목적 잠금없이 동시성을 높이면서 일관된 읽기를 제공하기 위해 사용한다. Mutli Version 다중 버전의 레코드가 읽게 된. 격리 수준에 따라 레코드가 어떻게 읽힐 지가 결정된다. 예시 CREATE TABLE memberTbl( member_id INT NOT NULL AUTOINCREMENT PRIMARY KEY, member_name VARCHAR(24) NOT NULL, join_date DATE NOT NULL ); INERT INTO memberTbl(member_id, member_name, join_date) VALUES(1, 'John', '2022-05-01'); COMMIT; 위 연산의 실행 결과는 다음과 같다...

DB/MySQL 2022.05.01

트랜잭션 고립 수준에 따른 부정합 문제

트랜잭션 격리 수준 (isolation level) 여러 트랜잭션이 동시에 처리될 때 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 말지를 결정하는 것이다. 부정합 문제 격리 수준에 따라 Dirty Read / Non-Repeatable Read / Phantom Read가 발생할 수 있다. Dirty Read 트랜잭션 T1에서 Reika라는 이름을 가진 계정 정보를 INSERT하였다. 트랜잭션 T2에서는 T1이 COMMIT을 하기 전에 해당 레코드를 읽었다. 트랜잭션 T1이 COMMIT을 완료한다. Dirty Read 현상에서는 한 트랜잭션에서 변경한 사항을 아직 COMMIT하기 전임에도 불구하고 다른 트랜잭션에서 읽을 수 있는 것을 말한다. 이러한 현상을 허용하는..

DB/이론 2022.05.01

내부 조인과 외부 조인

내부 조인 Inner Join 두 테이블의 컬럼 값을 결합으로써 새로운 결과 테이블을 만들어내는 것. 비교하는 컬럼 값이 항상 존재하는 레코드만으로 테이블을 생성해낸다. 명시적 조인 JOIN 키워드 뒤에 ON 절을 사용하여 결합 기준이되는 컬럼을 지정한다. SELECT * FROM employee INNER JOIN department ON employee.DepartmentID = department.DepartmentID; 암시적 조인 SELECT 구문의 FROM 절에서 컴마를 사용하여 단순히 조인을 위한 테이블을 나열한다. 이는 CROSS JOIN을 암묵적으로 사용하게 되고 WHERE 절에 오는 컬럼 비교를 사용하여 새로운 조인 테이블을 만들게 된다. SELECT * FROM employee, de..

DB/이론 2022.04.30

테이블 정규화

데이터 베이스 ACID ACID(원자성, 일관성, 고립성, 지속성) 특징은 데이터 베이스 트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 성질을 가리키는 약어이다. 데이터베이스에서 데이터에 대한 하나의 논리적 실행단계를 트랜잭션이라고 한다. 원자성(Atomicity)은 트랜잭션과 관련된 작업들이 부분적으로 실행되다가 중단되지 않는 것을 보장하는 능력이다. 예를 들어, 사용자 A가 B에게 돈을 입금한 경우 B의 계좌에 입금과 A의 출금 실행이 한번에 이루어져야하며 둘 중 하나가 실패한 상태가 존재해서는 안된다. 일관성(Consistency)은 트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지하는 것을 말한다. 독립성(Isolation) 트랜잭션을 수행 시 다른 트랜잭션이 ..

DB/이론 2022.04.29

MySQL 인덱스

Real MySQL의 인덱스 내용을 개인 공부를 위해 정리한 글입니다. 모든 저작권은 Real MySQL 8.0 (위키북스 / 백은빈, 이성욱 저)에 있음을 밝힙니다. 인덱스란 DBMS에서 인덱스는 데이터의 저장(insert, update, delete) 성능을 희생하고 데이터의 읽기 성능을 높이는 기능이다. 인덱스의 종류 프라이머리 키 (Primary Key): 레코드를 대표하는 컬럼의 값으로 만들어진 인덱스를 말한다. 식별자라고도 하며 NULL값을 허용하지 않고 중복을 허용하지 않는 것이 특징이다. 보조 키 혹은 세컨더리 인덱스 (Secondary Index) : 유니크 인덱스는 프라이머리 키와 성격이 비슷하고 프라이머리 키를 대체해여 사용할 수 도 있어 대체 키라고도 한다. 데이터 저장 방식에는 B..

DB/MySQL 2022.01.09

MySQL 트랜잭션과 잠금

잠금 Lock 동시성을 제어하기 위한 기능 트랜잭션 Transaction 데이터의 정합성 Consistency을 보장하기 위한 기능 MySQL 트랜잭션 트랜잭션이란 논리적인 작업 셋 자체가 100% 적용되거나(Commit) 아무것도 적용되지 않아야(Rollback)함을 보장해 주는 것 데이터의 부분 업데이트 문제 CREATE TABLE tab_myisam ( fdpk INT NOT NULL, PRIMARY KEY (fdpk) ) ENGINE=MyISAM; INSERT INTO tabl_myisam ( fdpk ) VALUES (3); CREATE TABLE tabl_innodb ( fdpk INT NOT NULL, PRIMARY KEY (fdpk) ) ENGINE=INNODB; INSERT INTO ta..

DB/MySQL 2022.01.02