728x90

MySQL 6

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

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

인덱스 컬럼의 가공(연산)은 예상치 못한 결과를 초래한다.

MySQL 2판을 보던 중 한가지 사실을 알았다. 바로 WHERE 조건문에 INDEX 를 통해서 검색하려고 할때 INDEX 에 변환 또는 연산을 가하게 될 경우 인덱스 조건을 안타게 된다는 사실이다. 아래 쿼리를 한번 보자. 지금 위의 쿼리를 한번 살펴보면 첫번째 쿼리는 age 라는 INDEX 컬럼에 2를 곱한 뒤 age=20 인 컬럼의 데이터를 가져오는 쿼리이다. 두번째 쿼리는 반대로 age = 40/2 인 즉 age = 20 인 쿼리를 가져오는 것이므로 두 쿼리의 결과는 아래처럼 똑같다. 하지만 결과는 같은데 MySQL 의 옵티마이저가 내린 판단은 다르다. 그 이유는 무엇일까? MySQL 에서는 기본적으로 정렬에 B-Tree 자료구조를 이용하는데 이때 사용자가 설정한 Index 의 값으로 정렬이 되어..

데이터베이스 2022.02.13

[Spring Batch] Batch Info Table 수동 생성하기

운영 서버에서는 Batch Schema 를 always 나 Embedded 로 설정하지 않을때가 많다. 어떤 배치가 실행됬고, 얼마나 Rollback 됬는지 이런것들을 파악하기 위해서는 정보가 남아있어야 하기 때문이다. 오늘은 간단하게 Batch 정보를 만드는 실습을 해보려고 한다. spring.batch.initialize-schema: never 요 위에 처럼 설정해주자. 수동 설정의 경우 Schema 를 찾아서 업데이트 해주어야 한다. Schema 파일의 경우 Spring-batch-core 부분에 위치하고 있다. 일단 External-Library 에서 위와 같은 디렉토리를 찾자. 아래로 쭈욱 내려보면 아래 사진과 같은 schema DDL 을 기록해둔 파일들이 보인다. 이제 자신에 벤더사에 맞는 ..

Java 2021.12.12

MySQL Lock System

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

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