본문 바로가기

프로그래밍/데이터베이스

(8)
[Real Mysql] 프로그램 연동 JDBC JDBC 는 어플리케이션과 데이터베이스를 연결하는 인터페이스 부분이다. Connector/J - MySQL 의 JDBC 이름 JDBC URL MySQL 서버의 정보를 표준 포맷으로 조합한 문자열 ex) jdbc:mysql://서버IP:포트/db네임 Statement JDBC를 사용하는 어플리케이션에서 SQL과 DDL 문장을 실행하는데 필요한 객체 PreParedStatement 쿼리 분석이나 최적화 작업을 처음 한번만 수행해서 별도로 저장을 해놓고, 그 뒤 저장된 분석 결과를 재사용 하는 방식 SQL 문장 자체가 네트워크로 전송되지 않고 바인딩할 변수값만 전달 JDBC 가 데이터를 가져오는 방식 클라이언트 커서 방식 MySQL에서 정보를 모두 받아 JDBC가 가지고 있고, JDBC 를 사용하는 측에서 일..
[Real Mysql] 파티션 파티션이란 파티션이란 사용자는 하나의 테이블로 읽고 쓰지만 MySQL 서버 입장에서 데이터를 별도의 테이블로 분리해서 저장을 하는것 파티션은 하나의 서버에서 테이블을 분산하는것이지, 원격 서버로 분산 시키는 건 아니다. 파티션 사용 이유 한 테이블이 너무 커서 인덱스 크기가 메모리보다 훨씬 크거나 데이터 특성상 삭제 작업이 필요한 경우 단일 INSERT 와 SELECT 의 빠른 처리 insert 작업처럼 레코드의 변경이 발생하면 인덱스의 변경을 위한 작업이 발생하게 되고 이때 index 크기가 너무 크다면 부하가 생길 수 있다. 파티션을 사용하면 index 에 크기도 작아지게 되서 성능 향상을 할 수 있다. 데이터의 물리적인 저장소 분리 파티션을 통해 파일의 크기를 조절하거나 각 파티션별 저장될 위치를 ..
[Real mysql] 쿼리 작성 및 최적화 쿼리들이 어떻게 처리가 되는지를 알아보자 SELECT select 는 여러 테이블을 조합해서 빠르게 가져와야 하기 때문에 여러 테이블을 어떻게 읽을 것인지 많은 주의를 기울여야 한다. 인덱스를 적절히 사용하면 order by 나 group by 가 있어도 해당 실행 순서가 skip 되기도 한다. GROUP BY group by 절에 명시한 컬럼과 인덱스 컬럼 순서와 위치 모두 동일해야 한다. 인덱스 순서와 위치가 중요 예를들어 컬럼이 col1, col2, col3, col4 가 있다면 group by col2, col1 group by col1, col3 group by col1, col2, col3, col4, col5 등 처럼 순서가 맞지 않고 특정 컬럼이 빠져있다면 인덱스를 타지 않는다. 대신 gr..
[Real Mysql] 실행계획 - 쿼리 동작 방식 MySQL 엔진에서 처리하는데 시간이 오래 걸리는 작업의 원리를 알아두자 풀 테이블 스캔 인덱스를 사용하지 않고 테이블의 데이터를 처음부터 끝까지 읽어 요청된 작업을 처리한다. 풀테이블 스캔을 하는 경우 - 레코드 수가 너무 작아서 인덱스 보다 풀테이블 스캔을 하는게 빠른 경우 - WHERE 절이나 ON 절에 인덱스를 이용할 수 있는 조건이 없을때 - 인덱스 레인지가 가능하더라도 옵티마이저가 판단하기에 너무 많은 수의 건수인 경우 ORDER BY 정렬을 크게 - 인덱스를 이용하는 방법 - FileSort 라는 별도 처리 방법 을 이용하는 방법이 있ㅎ다. 인덱스를 사용하지 않는다면 실행계획 extra컬럼에 Using filesort 가 표시된다. - 소트 버퍼 정렬을 수행하기 위해 별도로 할당받은 메모리 ..
[Real Mysql] 실행 계획 DBMS 에서 쿼리를 최적으로 실행하기 위해 각 테이블의 데이터가 어떤 분포로 저장되어 있는지 통계정보를 참조하며, 이런 기본 데이터를 비교해서 최적의 실행 계획을 수립하는 작업이 필요한데 이걸 옵티마이저가 담당한다. explain 명령어로 실행 계획을 확인 할 수 있다. 옵티마이저 쿼리가 실행되는 과정을 크게 3가지로 나눌 수 있는데 1. 사용자로부터 요청된 SQL 문장을 잘라서 MySQL 서버가 이해 할 수 있는 수준으로 분리 2. 정보를 확인해서 어떤 테이블로부터 어떤 인덱스를 이용해 테이블을 읽을지 선택 3. 두번째 단계에서 결정된 테이블의 읽기 순서나 선택된 인덱스를 이용해서 스토리지 엔진으로부터 데이터를 가져온다. 여기서 두번째 단계를 옵티마이저가 처리한다. 옵티마이저 종류 - 규칙 기반 최적..
[Real Mysql] 인덱스 디스크 읽기 방식 DB의 성능 튜닝은 디스크 I/O를 어떻게 줄이냐가 관건이다. 모든 저장매채들은 내부적으로 1개 이상의 디스크 드라이브를 장착하고 있는데, 대부분 디스크 드라이브의 플래터(저장용 원판)을 회전시켜 데이터를 읽고 쓰는 방식을 사용한다. 디스크에 데이터를 쓰고 읽을때 걸리는 시간은 디스크 헤더를 움직여서 읽고 쓸 위치로 옮기는 단계에서 결정된다. 즉, 디스크 성능은 디스크 헤더의 위치 이동 없이 얼마나 많은 데이터를 기록하냐에 결정된다. 인덱스란? DBMS 에서 인덱스는 데이터의 저장 성능을 희생하고 대신 데이터의 읽기 성능을 높이는 기능이다. 인덱스를 역할별로 구분해보면 PK 와 Secondary Key로 구분 할 수 있다. - PK : 레코드를 대표하는 컬럼으로 만들어진 인덱스 - Se..
[Real Mysql] 트랜잭션과 잠금 트랜잭션 트랜잭션은 작업의 완전성을 보장해주는 것 모두 완벽하게 처리되거나 또는 처리되지 못할 경우 원 상태로 복구 시키는 기능 트랜잭션은 꼭 최소한의 코드에만 적용되는 것이 좋다. 프로그램의 코드가 DB 컨넥션을 가지고 있는 범위와 트랜잭션이 활성화 돼있는 프로그램의 범위를 최소화 해야 한다. 코드에서 네트워크 작업이나 메인전송, FTP 파일 전송등과 같은 작업은 꼭 트랜잭션에서 제거하는게 좋다. 제거하지 않으면 DBMS 서버가 높은 부하 상태로 빠지거나 위험한 상태에 빠지는 경우가 번번히 나타나곤한다. 트랜잭션 격리 수준 동시에 여러 트랜잭션이 처리 될때, 특정 트랜잭션이 다른 트랜잭션에 서 변경하거나 조회하는 데이터를 볼 수 있도록 허용 할지 말지를 결정하는 것 격리수준은 크게 - READ UNCO..
[Real Mysql] Mysql 아키텍처 Mysql 전체 구조 MySQL 엔진 클라이언트의 접속과 요청을 처리하는 커넥션 핸들러와 SQL 파서 및 전처리기가 있고, 쿼리를 최적화시켜주는 SQL 옵티마이저가 있다. SQL 문장을 분석하고 최적화 시키는 중요 업무를 수행 스토리지 엔진 실제 데이터를 디스크에 저장하거나 디스크에서 데이터를 읽어오는 부분 MySQL 엔진은 하나지만 스토리지 엔진은 여러개를 사용할 수 있다. 테이블을 생성할때 스토리지 엔진을 정하면 해당 테이블의 읽기 작업이나 변경 작업은 해당 스토리지 엔진이 처리하게 된다. 핸들러 요청 핸들러 요청은 MySQL 엔진에서 스토리지 엔진에 보내는 요청 핸들러 API 핸들러 요청에서 사용되는 API 스레드 구조 MySQL 은 프로세스 기반이 아니라 스레드 기반으로 동작한다. 크게 포그라운드..