반응형 Database25 MySQL Full Text (with QueryDsl) 전문 검색 인덱스 문서의 내용 전체를 인덱스화해서 특정 키워드가 포함된 문서를 검색하는 전문(Full Text)검색에는 InnoDB, MyISAM 스토리지 엔진에서 제공하는 일반적인 용도의 B-Tree 인덱스를 사용할 수 없다. 문서 전체에 대한 분석과 검색을 위한 인덱싱 알고리즘을 전문 검색 인덱스라고 하는데, 전문 검색 인덱스는 일반화된 기능의 명칭이지 전문 검색 알고리즘의 이름을 지칭하는 것은 아니다. 전문 검색 인덱스 알고리즘 전문 검색 인덱스는 문서의 키워드를 인덱싱하는 기법에 따라 크게 단어의 어근 분석과 n-gram 분석 알고리즘으로 구분할 수 있다. 예전에는 구분자도 하나의 알고리즘으로 평가됐지만 어근 분석과 n-gram 분석 알고리즘에 포함되었다. 어근 분석 알고리즘 MySQL 서버의 전.. Database/MySQL 2023. 12. 16. InnoDB가 Phantom Read를 피하는 법 Real MySQL 복습을 진행하면서 가볍게 읽고 넘어갔지만 원리가 궁금해진 부분이 생겼다. InnoDB 스토리지 엔진에서는 갭 락과 넥스트 키 락을 어떻게 사용하길래 REPEATABLE READ 격리 수준에서도 팬텀 리드가 발생하지 않을까? 이 궁금증을 해소하고자 한다. REPEATABLE READ, 갭락과 넥스트 키 락에 대한 내용은 아래 포스팅에서 확인할 수 있다. https://devdebin.tistory.com/252 트랜잭션과 잠금 2023.10.9 복습 리팩토링 시작 트랜잭션 트랜잭션은 작업의 완전성을 보장해 준다. 즉, 정합성을 보장하기 위한 기능이다. 논리적인 작업 셋을 모두 완벽하게 처리하거나, 처리하지 못할 경우에는 devdebin.tistory.com 팬텀 리드 팬텀 리드란 다른 .. Database/MySQL 2023. 10. 11. NL 조인 쿼리 튜닝 이번에는 생애 처음으로 토이 프로젝트의 쿼리를 튜닝해보았습니다. 프로젝트에서 제일 많이 호출되는 쿼리를 튜닝했는데 그 경험을 적어보겠습니다. 쿼리 튜닝 환경 M1 air RAM 16GB, SSD 512GB Docker 컨테이너 Mysql 8.x 버전 다대다 관계 튜닝하기 project라는 테이블과 member라는 테이블은 다대다 관계다. 중간 관계 테이블로 project_member라는 테이블이 존재한다. 테스트 데이터는 MySQL 프로시저를 활용해서 주입했으며 데이터 갯수는 아래와 같다. member: 200만 project: 500만 project_member: 1400만 먼저 쿼리를 살펴보자. 내가 참여한 모든 프로젝트를 조회하는 쿼리다. 디스코드 사이드 바에서 내가 참여한 모든 채팅방을 보여줄 때.. Database/SQL 튜닝 2023. 8. 25. 조인 튜닝 (1) NL 조인 조인의 기본은 NL 조인이다. NL은 Nested Loops 조인의 약어다. 즉 중첩 루프문과 같은 수행 구조를 사용한다. 일반적으로 NL 조인은 Outer와 Inner 양쪽 테이블 모두 인덱스를 사용한다. Outer 쪽 테이블은 사이즈가 크지 않으면 인덱스를 이용하지 않을 수 있다. Table Full Scan 하더라도 그것은 한 번에 그치기 때문이다. Inner 쪽 테이블은 인덱스를 사용해야 한다. Inner 루프에서 외래키로 데이터를 검색할 때 인덱스를 이용하지 않으면, Outer 루프에서 읽은 건수만큼 Table Full Scan을 반복하기 때문이다. NL 조인은 '인덱스를 이용한 조인 방식'이라고 할 수 있다. 튜닝 포인트 Outer Table 인덱스를 읽고 나서 Outer Table.. Database/SQL 튜닝 2023. 8. 24. 인덱스 튜닝 1. 테이블 액세스 최소화 테이블 랜덤 액세스 인덱스 ROWID는 물리적 주소? 논리적 주소? 인덱스를 스캔하는 이유는, 검색 조건을 만족하는 소량의 데이터를 인덱스에서 빨리 찾고 거기서 테이블 레코드를 찾아가기 위한 주소 값, 즉 ROWID를 얻으려는 데 있다. 인덱스 ROWID는 물리적 주소보다 논리적 주소에 가깝다. 물리적으로 직접 연결되지 않고 테이블 레코드를 찾아가기 위한 논리적 주소 정보를 담고 있기 때문이다. ROWID는 프로그래밍에서 말하는 포인터가 아니며, 테이블 레코드와 물리적으로 직접 연결된 구조는 더더욱 아니다. 오라클 같은 경우는 테이블 블록이 수시로 버퍼캐시에서 밀려났다가 다시 캐싱되며, 그때마다 다른 공간에 캐싱되기 때문에 인덱스에서 포인터로 직접 연결할 수 없는 구조다. 메모.. Database/SQL 튜닝 2023. 8. 23. 인덱스 기본 인덱스 구조 및 탐색 RDBMS 테이블에서 데이터를 찾는 방법은 두 가지다. 테이블 전체 스캔 인덱스 이용 인덱스는 큰 테이블에서 소량 데이터를 검색할 때 사용한다. 세부적인 인덱스 튜닝 방법의 핵심은 크게 두 가지다. 첫 번째는 인덱스 스캔 과정에서 발생하는 비효율을 줄이는 것이다. 즉, 인덱스 스캔 효율화 튜닝이다. 두 번째는 테이블 액세스 횟수를 줄이는 것이다. 인덱스 스캔 후 테이블 레코드를 액세스할 때 랜덤 I/O 방식을 사용하므로 이를 '랜덤 액세스 최소화 튜닝'이라고 한다. 둘 중 더 중요한 것은 랜덤 액세스 최소화 튜닝이다. 결국 SQL 튜닝은 랜덤 I/O와의 전쟁이다. DB 성능이 느린 이유는 디스크 I/O 때문이다. 읽어야 할 데이터량이 많고, 그 과정에 디스크 I/O가 많이 발생할 때.. Database/SQL 튜닝 2023. 8. 22. SQL 처리 과정과 I/O SQL 파싱과 최적화 프로시저란 일련의 쿼리를 마치 하나의 함수처럼 실행하기 위한 쿼리의 집합이다. 프로시저를 만들어주는 DBMS 내부 엔진이 바로 SQL 옵티마이저다. DBMS 내부에서 프로시저를 작성하고 컴파일해서 실행 가능한 상태로 만드는 전 과정을 'SQL 최적화'라고 한다. SQL 최적화 최적화 순서 과정은 아래와 같다. 1. SQL 파싱 SQL 파싱을 요약하면 아래와 같다. 파싱 트리 생성: SQL 문을 이루는 개별 구성요소를 분석해서 파싱 트리를 생성한다. Syntax 체크: 문법적 오류가 없는지 확인한다. Semantic 체크: 의미상 오류가 없는지 확인한다. 예시로는 권한이 있는지 확인. 2. SQL 최적화 SQL 옵티마이저는 미리 수집한 시스템 및 오브젝트 통계정보를 바탕으로 다양한 실.. Database/SQL 튜닝 2023. 4. 27. 클러스터링 인덱스 클러스터링이란 여러 개를 하나로 묶는다는 의미로 주로 사용되는데, 지금 설명하고 자하는 인덱스의 클러스터링도 그 의미를 크게 벗어나지 않는다. MySQL 서버에서 클러스터링은 테이블의 레코드를 비슷한 것(프라이머리 키를 기준으로)들끼리 묶어서 저장하는 형태로 구현되는데, 이는 주로 비슷한 값들을 동시에 조회하는 경우가 많다는 점에 착안한 것이다. MySQL에서 클러스터링 인덱스는 InnoDB 스토리지 엔진에서만 지원하며, 나머지 스토리지 엔진에서는 지원되지 않는다. 클러스터링 인덱스 클러스터링 인덱스는 테이블의 프라이머리 키에 대해서만 적용되는 내용이다. 즉 프라이머리 키 값이 비슷한 레코드끼리 묶어서 저장하는 것을 클러스터링 인덱스라고 표현한다. 여기서 중요한 것은 프라이머리 키 값에 의해 레코드의 저.. Database/MySQL 2022. 12. 2. B-Tree 인덱스 2편 B-Tree 인덱스를 통한 데이터 읽기 어떤 경우에 인덱스를 사용하게 유도할지, 또는 사용하지 못하게 할지 판단하려면 각 스토리지 엔진이 어떻게 인덱스를 이용(경유)해서 실제 레코드를 읽어 내는지 알아야 한다. 인덱스 레인지 스캔 인덱스 레인지 스캔은 인덱스의 접근 방법 가운데 가장 대표적이며, 앞으로 나올 두 가지 접근 방식보다 빠른 방법이다. 인덱스를 통해 레코드를 한 건만 읽는 경우와 한 건이상을 읽는 경우를 각각 다른 이름으로 구분하지만, 이번에는 모두 묶어서 인덱스 레인지 스캔이라고 표현했다. 인덱스 레인지 스캔은 검색해야 할 인덱스의 범위가 결정됐을 때 사용하는 방식이다. 검색하려는 값의 수나 결과 레코드 건수와 관계 없이 레인지 스캔이라고 표현한다. 루트 노드에서부터 비교를 시작해 브랜치 노.. Database/MySQL 2022. 12. 2. B-TREE 인덱스 1편 2023.10.11 복습 리팩토링 시작 B-Tree 인덱스 B-Tree는 제일 범용적인 인덱스 알고리즘이다. 여기서 B는 Binary가 아니라 Balanced라는 의미를 지닌다. B-Tree 칼럼의 원래 값을 변형시키지 않고 (물론 값의 앞부분만 잘라서 관리하기는 하지만) 인덱스 구조체 내에서는 항상 정렬된 상태를 유지한다. 전문 검색과 같은 특수한 요건이 아닌 경우, 대부분의 인덱스는 B-Tree를 사용할 정도로 일반적인 용도에 적합한 알고리즘이다. 구조 및 특성 B-Tree는 트리 구조의 최상위에 하나의 루트 노드가 존재하고 그 하위에 자식 노드가 붙어 있는 형태다. 트리 구조의 가장 하위에 있는 노드를 리프 노드라 하고, 트리구조에서 루트 노드도 아니고 리프노드도 아닌 중간의 노드를 브랜치 노드라고.. Database/MySQL 2022. 12. 1. MySQL 인덱스 기초 2023.10.10 복습 리팩토링 시작 디스크 읽기 이번에 인덱스에서 자주 나올 랜덤 I/O와 순차 I/O에 대한 개념을 정리하고 넘어가겠습니다. 하드 디스크 드라이브 (HDD)와 솔리드 스테이트 드라이브(SSD) 컴퓨터에서 CPU나 메모리 같은 주요 장치는 대부분 전자식 장치지만 하드 디스크 드라이브는 기계식 장치다. 그래서 데이터베이스 서버에서는 항상 디스크 장치가 병목이 된다. 이러한 HDD를 대체하기 위해 전자식 저장 매체인 SSD가 많이 출시되고 있다. SSD도 기존 하드디스크 드라이브에서 데이터 저장용 플래터(원판)을 제거하고 그 대신 플래시 메모리를 장착하고 있다. 그래서 원판을 기계적으로 회전시킬 필요가 없으므로 아주 빨리 데이터를 읽고 쓸 수 있다. 플래시 메모리는 전원이 공급되지 않아도.. Database/MySQL 2022. 11. 30. 트랜잭션과 잠금 2023.10.9 복습 리팩토링 시작 트랜잭션 트랜잭션은 작업의 완전성을 보장해 준다. 즉, 정합성을 보장하기 위한 기능이다. 논리적인 작업 셋을 모두 완벽하게 처리하거나, 처리하지 못할 경우에는 원 상태로 복구해서 작업의 일부만 적용되는 현상이 발생하지 않게 만들어준다. MyISAM과 MEMORY 스토리지 엔진은 트랜잭션을 지원하지 않는다. 트랜잭션은 하나의 논리적인 작업 셋에 하나의 쿼리가 있든 두 개 이상의 쿼리가 있든 관계 없이 논리적인 작업 셋 자체가 100% 적용되거나(COMMIT을 실행했을 때) 아무것도 적용되지 않아야 (ROLLBACK 또는 트랜잭션을 ROLLBACK 시키는 오류 발생) 함을 보장해 주는 것이다. InnoDB : 트랜잭션 지원, 부분 업데이트 현상 발생 X MyISAM, M.. Database/MySQL 2022. 11. 29. 이전 1 2 3 다음 반응형