MySQL 12

MySQL(12) - Index

- R-Tree 인덱스공간 인덱스는 R-Tree 인덱스 알고리즘을 이용해 2차원의 데이터를 인덱싱하고 검색하는 목적의 인덱스다. 공간 정보의 검색을 위한 R-Tree 알고리즘을 이해하려면 MBR이라는 개념을 알고 있어야 한다. MBR이란 "Minimun Bounding Rectangle"의 약자로 해당 도형을 감싸는 최소 크기의 사각형을 의미한다.공간 인덱스는 일반적으로는 GPS 기준의 위도, 경도 좌표 저장에 주로 사용된다. 대표적으로는 '현재 사용자의 위치로부터 반경 5km 이내의 음식점 검색'등과 같은 검색에 사용할 수 있다.- 전문 검색 인덱스문서의 키워드를 인덱싱하는 기법에 따라 크게 단어의 어근 분석과 n-gram 분석 알고리즘으로 구분할 수 있다.불용어 처리를 통해 예상하지 못한 토큰들이 걸..

Database 2023.10.11

MySQL(11) - Index

- 디스크 읽기 방식데이터베이스의 성능 튜닝은 어떻게 디스크 I/0를 줄이느냐가 관건일때가 상당히 많다.1. HDD와 SSDSSD의 장점은 기존 하드 디스크 드라이브보다 랜덤 I/O가 훨씬 빠르다는 것이다.2. 랜덤 I/O와 순차 I/O디스크에 데이터를 쓰고 읽는 데 걸리는 시간은 디스크 헤더를 움직여서 읽고 쓸 위치로 옮기는 단계에서 결정된다. 즉 디스크의 성능은 디스크 헤더의 위치 이동 없이 얼마나 많은 데이터를 한 번에 기록하느냐에 의해 결정된다.일반적으로 쿼리를 튜닝하는 것은 랜덤 I/O 자체를 줄여주는 것이 목적이라고 할 수 있다. 여기서 랜덤 I/O를 줄인다는 것은 쿼리를 처리하는 데 꼭 필요한 데이터만 읽도록 쿼리를 개선하는 것을 의미한다. - 인덱스란?칼럼의 값과 해당 레코드가 저장된 주소..

Database 2023.10.10

MySQL(10)

- 데이터 암호화MySQL 서버의 암호화 기능은 데이터베이스 서버와 디스크 사이의 데이터 읽고 쓰기 지점에서 암호화 또는 복호화를 수행한다. MySQL 서버에서 사용자의 쿼리를 처리하는 과정에서 테이블의 데이터가 암호화돼 있는지 여부를 식별할 필요가 없으며, 암호화된 테이블도 그렇지 않은 테이블과 동일한 처리 과정을 거친다.MySQL 서버의 TDE에서 암호화 키는 키링 플러그인에 의해 관리되고 키링 플러그인은 2단계 키 관리 방식을 사용한다. MySQL 서버의 데이터 암호화는 마스터 키와 테이블스페이스 키라는 두 가지 종류의 키를 가지고 있다. 이렇게 2단계 암호화 방식을 사용하는 이유는 암호화 키 변경으로 인한 과도한 시스템 부하를 피하기 위해서다.MySQL 서버의 암호화는 데이터 페이지가 한 번 메모..

Database 2023.10.06

MySQL(9)

-데이터 압축MySQL 서버에서 디스크에 저장된 데이터 파일의 크기는 일반적으로 쿼리의 처리 성능과도 직결되지만 백업 및 복구 시간과도 밀접하게 연결된다.MySQL 서버에서 사용 가능한 압축 방식은 크게 테이블 압축과 페이지 압축의 두 가지 종류로 구분할 수 있다.페이지 압축페이지 압축은 "Transparent Page Compression"이라고도 불리는데, MySQL 서버가 디스크에 저장하는 시점에 데이터 페이지가 압축되어 저장되고, 반대로 디스크에서 데이터 페이지를 읽어올 때 압축이 해제된다. 여러 가지 문제점들로 인해 많이 사용되지 않는다.테이블 압축테이블 압축은 운영체제나 하드웨어에 대한 제약 없이 사용할 수 있기 때문에 일반적으로 더 활용도가 높다.1. 압축 테이블 생성테이블 압축을 사용하기 ..

Database 2023.10.06

MySQL(8)

- MySQL의 격리 수준트랜잭션의 격리 수준이란 여러 트랜잭션이 동시에 처리될 때 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 말지를 결정하는 것이다.READ UNCOMMITTEDREAD UNCOMMITTED 격리 수준에서는 각 트랜잭션에서의 변경 내용이 커밋이나 롤백 여부에 상관없이 다른 트랜잭션에서 보인다. 이처럼 어떤 트랜잭션에서 처리한 작업이 완료되지 않았는데도 다른 트랜잭션에서 볼 수 있는 현상을 더티 리드라고 한다.READ COMMITTED오라클 DBMS에서 기본으로 사용되는 격리 수준이며, 온라인 서비스에서 가장 많이 선택되는 격리 수준이다. 이 레벨에서는 더티 리드 같은 현상은 발생하지 않는다.하나의 트랜잭션 내에서 똑같은 SELECT 쿼리를 실행했..

Database 2023.10.05

MySQL(7)

- 트랜잭션트랜잭션은 작업의 완전성을 보장해 주는 것이다. 즉 논리적인 작업 셋을 모두 완벽하게 처리하거나, 처리하지 못할 경우에는 원 상태로 복구해서 작업의 일부만 적용되는 현상이 발생하지 않게 만들어주는 기능이다.만약 트랜잭션 기능이 없다면 실패에 대한 재처리 작업은 상당히 번거롭고 고민거리가 될 것이다.트랜잭션 또한 DBMS의 커넥션과 동일하게 꼭 필요한 최소의 코드에만 적용하는 것이 좋다. 이는 프로그램 코드에서 트랜잭션의 범위를 최소화하라는 의미다. 특히 네트워크 작업이 있는 경우에는 반드시 트랜잭션에서 배제해야 한다. - 잠금MySQL에서 사용되는 잠금은 크게 스토리지 엔진 레벨과 MySQL 엔진 레벨로 나눌 수 있다.MySQL 엔진의 잠금글로벌 락한 세션에서 글로벌 락을 획득하면 다른 세션에..

Database 2023.09.28

MySQL(6)

- MySql 로그 파일로그 파일을 이용하면 MySQL 서버의 깊은 내부 지식이 없어도 MySQL의 상태나 부하를 일으키는 원인을 쉽게 찾아서 해결할 수 있다.에러 로그 파일MySQL이 시작하는 과정과 관련된 정보성 및 에러 메시지마지막으로 종료할 때 비정상적으로 종료된 경우 나타나는 InnoDB의 트랜잭션 복구 메시지쿼리 처리 도중에 발생하는 문제에 대한 에러 메시지비정상적으로 종료된 커넥션 메시지InnoDB의 모니터링 또는 상태 조회 명령의 결과 메시지MySQL의 종료 메시지제너럴 쿼리 로그 파일제너럴 쿼리 로그는 실행되기 전에 MySQL이 쿼리 요청을 받으면 바로 기록하기 때문에 쿼리 실행 중에 에러가 발생해도 일단 로그 파일에 기록된다.슬로우 쿼리 로그슬로우 쿼리 로그는 MySQL이 쿼리를 실행한..

Database 2023.09.28

MySQL(5)

- InnoDB 버퍼 풀InnoDB 스토리지 엔진에서 가장 핵심적인 부분으로, 디스크의 데이터 파일이나 인덱스 정보를 메모리에 캐시해 두는 공간이다. 쓰기 지연을 하는 버퍼 역할도 같이 한다. 버퍼 풀의 구조 - 크게 LRU 리스트, 플러시 리스트, 프리 리스트라는 3개의 자료 구조로 나뉜다.LRU 리스트 - LRU와 MRU 리스트가 결합된 형태LRU 리스트를 관리하는 목적은 디스크로부터 한 번 읽어온 페이지를 최대한 오랫동안 버퍼 풀의 메모리에 유지해서 디스크 읽기를 최소하하기 위해서다.플러시 리스트 - 디스크로 동기화되지 않은 데이터를 가진 데이터 페이지의 변경 시점 기준의 페이지 목록을 관리버퍼 풀의 데이터베이스 성능 향상 - 데이터 캐시와 쓰기 버퍼링클린 페이지 - 디스크에서 읽은 상태로 전혀 변..

Database 2023.09.24

MySQL(4)

- InnoDB 스토리지 엔진 아키텍처InnoDB의 모든 테이블은 기본적으로 프라이머리 키를 기준으로 클러스터링되어 저장된다. 쿼리의 실행 계획에서 프라이머리 키는 기본적으로 다른 보조 인덱스에 비해 비중이 높게 설정된다.InnoDB에서 외래 키는 부모 테이블과 자식 테이블 모두 해당 칼럼에 인덱스 생성이 필요하고, 변경 시에는 반드시 부모 테이블이나 자식 테이블에 데이터가 있는지 체크하는 작업이 필요하므로 잠금이 여러 테이블로 전파되고, 그로 인해 데드락이 발생할 때가 많으므로 개발할 때도 외래 키의 존재에 주의하는 것이 좋다.MVCC(Multi Version Concurrency Control)의 가장 큰 목적은 잠금을 사용하지 않는 일관된 읽기를 제공하는 데 있다. InnoDB는 언두 로그를 이용해..

Database 2023.09.20

MySQL(3)

- MySQL의 구조MySQL 엔진 - 요청된 SQL 문장을 분석하거나 최적화하는 등 DBMS의 두뇌에 해당하는 처리를 수행스토리지 엔진 - 실제 데이터를 스토리지에 저장하거나 데이터를 읽어오는 부분을 전담핸들러 API - 이 핸들러 API를 이용해 스토리지 엔진과 MySQL 엔진이 데이터를 주고 받음 - MySQL 스레딩 구조MySQL 서버는 스레드 기반으로 작동하며, 크게 포그라운드 스레드와 백그라운드 스레드로 구분할 수 있다.포그라운드 스레드 (클라이언트 스레드)포그라운드 스레드는 최소한 MySQL 서버에 접속된 수만큼 존재하며, 주로 각 클라이언트 사용자가 요청하는 쿼리 문장을 처리클라이언트 사용자가 작업을 마치고 커넥션을 종료하면 해당 커넥션을 담당하던 스레드는 다시 스레드 캐시로 되돌아감이미 ..

Database 2023.09.19