DB/MySQL 9

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

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

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

MySQL InnoDB 스토리지 엔진 아키텍처

InnoDB 스토리지 엔진 레코드 기반의 잠금을 제공하여 높은 동시성 처리와 안정적이고 뛰어난 성능을 가진다. 프라이머리 키에 의한 클러스터링 InnoDB의 모든 테이블은 기본적으로 프라이머리 키를 기준으로 클러스터링되어 저장된다. 모든 세컨더리 인덱스는 레코드의 주소 대신 프라이머리 키의 값을 논리적인 주소로 사용한다. 프라이머리 키를 이용한 범위 스캔은 굉장히 빨리 처리된다. 외래 키 지원 스토리지 엔진 레벨에서 지원하는 기능. 부모 자식 테이블 모두 해당 컬럼에 인덱스가 생성이 필요하며 변경 시에 부모 테이블이나 자식 테이블에 데이터가 있는 지 체크하는 작업이 필요하여 잠금이 여러 테이블로 전파되고 데드락 발생 가능성이 있기 때문에 외래 키 존재 여부에 주의하는 것이 좋다. MVCC (Multi V..

DB/MySQL 2021.12.30

MySQL 아키텍쳐

MySQL 서버 아키텍쳐 구조 스토리지 엔진 API SQL 문장을 분석하고 처리하여 디스크에 데이터를 쓰거나 읽는 등의 중요 역할을 담당한다. 핸들러 API 스토리지 엔진에 읽기 혹은 쓰기를 요청하는 핸들러 요청을 의미한다. MySQL 스레드 구조 MySQL은 스레드를 기반으로 작업을 처리한다. 1. 포그라운드 스레드 (클라이언트 스레드) 서버에 접속한 클라이언트 수만큼 존재하며 사용자가 요청하는 쿼리를 처리한다. 사용자가 연결을 종료하면 해당 포그라운드 스레드는 스레드 캐시로 돌악나다. 포그라운드 스레드는 MySQL의 데이터 버퍼나 캐시로부터 데이터를 가져오며 이에 없는 경우 직접 디스크 데이터 혹은 인덱스 파일로 부터 읽어서 작업을 처리한다. MyISAM은 쓰기 작업까지 포그라운드 스레드에서 진행되지..

DB/MySQL 2021.12.29

MySQL 사용자 및 권한

사용자 식별 'id_name'@'127.0.0.1' (IP 주소) 'id_name'@'%' (모든 주소) 시스템 계정과 일반 계정 시스템 계정은 다음 작업이 가능하다. 계정 관리 (새로운 계정 생성, 기존 계정 삭제, 권한 부여 및 제거) 세션 강제 종료 혹은 세션에서 수행되는 쿼리 강제 종료 스토어드 프로그램 생성 시 DEFINER를 타 사용자로 설정 잠겨있는 시스템 계정 (ACCOUNTLOCKED=Y) 다음 계정들은 시스템 계정으로 로그인이 불가능한 기본 계정이다. 'mysql.sys'@'localhost' : 기본으로 내장된 sys 스키마의 객체들의 DEFINER로 사용되는 계정 'mysql.session'@'localost' : MySQL 플러그인이 서버로 접근할 때 사용하는 계정 'mysql.i..

DB/MySQL 2021.12.23

MySQL 시스템 변수

MySQL 서버가 시작할 때 앞으로 어떻게 기동될 지 정의하는 변수 시스템 변수 확인 SHOW GLOBAL VARIABLES; MySQL 서버 시스템 변수관련 페이지 https://dev.mysql.com/doc/refman/8.0/en/server-system-variable-reference.html MySQL :: MySQL 8.0 Reference Manual :: 5.1.5 Server System Variable Reference MySQL 8.0 Reference Manual / ... / MySQL Server Administration / The MySQL Server / Server System Variable Reference PREV HOME UP NEXT dev.mysql.com ..

DB/MySQL 2021.12.20