728x90

데이터베이스/MySQL 7

[MySQL] ngram parser 를 이용할때 'a' 가 검색이 잘되지 않는 이유

이전에 ngram parser 를 이용한 자동완성 기능을 만들었다고 했었다. 실제로 적용해보니 문제가 있었는데 아래와 같은 문제가 발생했다. 위의 화면을 보면 'ach' 가 포함되어 있는 것만 검색하려고 BOOLEAN MODE 를 적용해서 쿼리를 날렸음에도 ach 가 없는 김루루 라는 콜럼이 검색되게 된다. 이유가 무엇일까? 문제 추론 처음에는 MySQL 의 Ngram Parser 의 Token size 를 1로 저장해놔서 아래와 같이 잘려서 그냥 알파벳만 들어가 있어도 검색이 되나 싶었다. 하지만 위와 같은 추론을 하기에는 무언가 연관성이 없어보였다. 왜냐하면 다른 글자로 검색을 해봤을때는 너무 잘 나오는 것이다. 이때까지만 해도 'a' 가 문제인줄을 몰랐다. 그래서 알아보던 도중 ngram parse..

인덱스 스캔 방식

어떤 경우에 인덱스를 이용하는게 좋은지를 판단하기 위해서는 어떻게 인덱스를 이용해서 실제 레코드를 읽어내는지 이해해야 한다. 인덱스를 이용하여 스캔하는 방식에는 대표적으로 3가지 방법이 있다. 인덱스 레인지 스캔 다음 쿼리를 예시로 한번 들어보자 mysql> SELECT * FROM employees WHERE first_name BETWEEN 'Ebbe' AND 'Gad'; 인덱스 레인지 스캔은 위와 같이 검색해야 할 인덱스의 범위가 결정됬을때 사용하는 방식이다. 위와 같이 루트 노드 -> 브랜치 노드 -> 리프노드 를 거쳐서 인덱스를 통해서 스캔해야할 지점을 찾는다. 이처럼 차례대로 쭉 인덱스를 읽어 스캔하는 것을 인덱스 레인지 스캔이라고 한다. 다만 대부분 인덱스만 읽어서 끝나지 않는다. 위와 같은..

MySQL Index

인덱스? 예전 신입 면접 필수질문 리스트에서 봐왔던 데이터베이스의 아주 중요한 지식 중 하나이다. 앞전에도 계속 설명했듯이 InnoDB 를 사용하고 있다면 인덱스에 대한 지식이 정말 중요하다. 일단 Index 가 성능과 밀접한 연관이 있는 이유를 설명하기 위해서는 간단하게라도 디스크 I/O를 설명해야 한다. 랜덤 I/O 그리고 순차 I/O 일단 랜덤 I/O가 일어나면 원하는 위치로 디스크 헤더를 이동시킨 다음 데이터를 읽어오는 작업이 발생한다. 그럼 순차 I/O 는 어떨까? 순차 I/O 도 마찬가지로 원하는 위치로 디스크 헤더를 이동시킨 다음 데이터를 읽어오는 작업이 발생한다. 그런데 두 읽기 방식에는 어떤 차이가 있을까? 바로 System Call 을 몇번 하는가에 차이가 있다. 위에 보이는 그림과 같..

MySQL Lock System

Lock(잠금) 이란 무엇일까? 여러 스레드가 하나의 자원에 접근 하는 것을 방지하기 위해 만든 개념이다. 예를 들면 하나의 화장실에 누군가 들어가 있다면 자물쇠로 잠궈두고, 그 사람이 해제하기 전까지 다른 사람은 접근하지 못하도록 하는 개념이 간단하게 Lock 의 개념이다. 이를 통해 우리는 하나의 자원에 대한 동기화를 진행할 수 있다. 데이터베이스 시스템에서도 이와 같은 개념이 필요한데, 왜냐하면 여러 사용자가 하나의 데이터에 대해 실시간으로 동시에 접근할 수도 있기 때문이다. 그래서 데이터를 보존해주기 위해 여러 개념들이 도입되어 있다. 예를 들면 트랜잭션도 하나의 서로 다른 사용자가 데이터에 접근할때 어떻게 보여주는가? 에 대한 개념을 구현한 것 중 하나라고 생각한다. 여하튼 MySQL 에서도 이..

MySQL 에 쿼리가 들어왔을때?

SQL 에 사용자가 쿼리를 날리면 어떤 동작과정이 있을까? 너무 딥다이브 하게는 어려울꺼 같고, Real MySQL 을 보면서 간단한 동작을 공부했던걸 정리해보려고 한다. 위와 같이 사용자가 DB 에 쿼리를 날리는 상황이라고 해보자. 일단 대부분의 컴파일 언어처럼 SQL 도 쿼리 컴파일러를 통해서 SQL 쿼리를 트리형태로 파싱한다. 이 파싱해 내는 과정에서 기본 문법 오류들을 짚어낸다. 이해하기 쉽게 대략적으로 요런식이라고 그려보았다. 근데 틀린 내용이 있으니 감안하고, 대충 이런식으로 토큰 처럼 만든다고 이해를 해주면 좋을 것 같다. 그럼 다음단계로 넘어가면, 전처리기 과정이다. 전처리기는 첫번째 단계에서 만들어진 파서트리를 바탕으로 쿼리문장에 구조적인 문제가 있는지 확인한다. 각 토큰을 컬럼이나 테이..

InnoDB 엔진의 특성

들어가기 전에 앞서, 이 책은 Real My SQL 1판을 읽고 정리한 내용입니다. 틀린 내용이 있댜면 댓글로 남겨주시면 감사하겠습니다. InnoDB 엔진은 우리가 주로 사용하는 데이터베이스 엔진 중 하나이다. InnoDB 는 도대체 어떤 특성을 가지고 있을까? 그 특성에 대해서 간단히 공부해보도록 하자 첫번째 특성, InnoDB 는 프라이머리로 기본적으로 기본키로 클러스터링을 구성한다. 즉 프라이머리 키 값의 순서대로 FileSystem 에 저장된다는 뜻이다. 따라서 Primary Key 값을 통한 범위 탐색을 하게 되면 빠르게 검색할 수 있는 이유이다. 두번째 특성, InnoDB 는 잠금이 필요없는 일관된 읽기를 제공한다. InnoDB 스토리지 엔진은 MVCC 를 이용해서 락을 걸지 않고 읽기 작업을..

회사코드 DeadLock 처리 정리

Deadlock Error 처리 에러 발생 위와 같이 DeadLock 이 나는 경우가 종종 잦아지는데 이유는 위와 같이 동일 요청이 두번오게 되는데 이 시점에 데드락걸릴 확률이 상당히 높습니다. 일단 간단히 데드락이 나는 이유를 위해서 코드를 봐야하는데 코드는 대략적으로 아래와 같은 구조입니다. 문제 해당 푸시 토큰과 같은 로우면를 업데이트 하고, 아니면 INSERT 해라 (INSERT... ON DUPLICATE KEY UPDATE) 해당 푸시 토큰과 유저 아이디가 같은 로우를 찾는 쿼리 푸시 토큰을 넘겨받았으면 nil 로 바꿔라 (어플리케이션 로직) 같은 푸시 토큰을 가지고 있는 로우가 있는데 유저가 다르다면 있다면 그건 nil 로 바꿔버려라 즉 위의 코드를 봤을때 중복 요청이 들어오면 충분히 데드락..

728x90