개발/Database (7) 썸네일형 리스트형 InnoDB FullText-Index를 이용한 검색 성능 향상 개요스터디 그룹 매칭 서비스 StudyHub를 진행하며 아쉬웠던 점을 하나 꼽자면 검색 기능입니다. 사용자 입장에서 생각했을 때 '정보처리기사' 모집 게시글을 업로드한다면 동일한 스터디에서도 아래와 같이 많은 게시글이 생성될 수 있습니다. '정보처리기사 스터디원 구합니다.' '꾸준히 진행할 스터디 구합니다. (정보처리기사)' 프로젝트에서 조회 시 성능을 위해 인덱스를 사용했기 때문에 '정보처리기사' 라고 검색했을 시 첫 번째 게시글만 검색되고 두번째 게시글은 검색이 안된다는 단점이 있었습니다. 물론 아직 데이터가 적기 때문에 '%검색문자열%' 과 같이 양쪽에 와일드카드를 삽입하는 방법이 있습니다. 하지만 추후 데이터가 많아졌을때를 대비하여 N-gram 파서를 이용해 검색 기능을 향상시켜보겠습니다. .. MySQL InnoDB B-Tree Index 탐색 과정 분석 개요 MySQL 인덱스는 인덱스 키 값의 시작값을 기준으로만 탐색이 가능합니다. 예를들어 Aamer라는 key 값을 기준으로 'A%'는 탐색이 가능하지만 '%A', '%A%'는 탐색이 불가능합니다. InnoDB에서 인덱스의 동작방식을 살펴보며 불가능한 이유를 알아보겠습니다. 본론 B-Tree는 트리 구조의 최상위에 하나의 루트 노드가 존재하고 그 하위에 자식 노드가 붙어 있는 형태입니다. 트리 구조 가장 하위에 있는 노드를 리프 노드라 하고, 트리 구조에서 루트 노드도 아니고 리프 노드도 아닌 노드를 브랜치 노드라고 표현합니다. 실제 DB의 인덱싱은 B-Tree와 비슷한 구조를 가진 B+Tree를 사용합니다. B+Tree는 아래와 같은 조건을 만족합니다. 1. 모든 리프 노드들이 같은 레벨을 가집니다. .. Hash 조인, NL 조인 서론 프로젝트 성능 향상을 위해 JOIN 관련해서 공부하던 중 의문점이 생겼습니다. 문제 상황은 아래와 같습니다. 1. 10^4건의 데이터를 가진 테이블 A와 B가 있다. 2. 두 테이블을 인덱스가 없는 칼럼을 기준으로 JOIN 할 경우 10^4 * 10^4 의 시간복잡도를 가지기 때문에 최소 1초는 걸릴 것이라 생각했다. 3. 실행 결과 15ms가 나왔다. 쿼리문은 아래와 같습니다. SELECT p.content FROM post AS p JOIN study AS s ON p.posted_user_id = s.master_user_id; 쿼리 실행계획을 통해 왜 예상과 다른 결과가 나왔는지 확인해보겠습니다. 본론 EXPLAIN ANALYZE 키워드로 확인한 결과 Inner hash join을 사용해 j.. [StudyHub] 성능 관점에서 확인해본 조회 쿼리문 서론 RealMySQL 8.0을 읽으면서 프로젝트에서 작성한 대부분의 쿼리문들이 성능을 염두해두지 않고 작성했다는 것을 알았다. 지금은 데이터 수가 적기 때문에 괜찮지만 추후 데이터 수가 많아졌을 때를 대비해 성능도 올릴겸, 책도 복습할겸 해서 성능 개선 여지가 있는 쿼리문을 확인해보겠다. LIKE @Override public List findByInquiry(final InquiryRequest inquiryRequest, final Pageable pageable, Long userId) { JPAQuery data = jpaQueryFactory .select(Projections.constructor(PostDataByInquiry.class, studyPostEntity.id.as("postI.. [StudyHub] 다중 칼럼 인덱스를 이용한 조회 성능 개선 서론 8만건의 데이터를 조회할 때 평균 95ms의 성능이 나왔기때문에 개선해보고자 한다. 개선하려는 쿼리문은 아래와 같다. SELECT p.post_id, p.major, p.study_start_date, p.study_end_date, u.email, u.image_url FROM post as p LEFT JOIN users as u on p.posted_user_id = u.user_id ORDER BY p.remaining_seat asc, p.created_date desc LIMIT 10 offset 5; 검색 조건은 로그인을 하지 않은 상태로 인기순, 생성날짜(나중에 생성한 날짜가 우선)로 정렬한 전체 데이터를 5 페이지 기준 상위 10개의 데이터를 가져오는 조건이다. 성능 테스트 테이블마.. [StudyHub] FK 매핑으로 인한 외래키 참조 무결성 문제 해결 서론 스터디허브 프로젝트에서 무분별하게 FK를 설정한 탓에 문제가 발생했다. 아래는 스터디허브의 회원, 신청, 스터디의 ERD이다. apply 테이블은 users, study 테이블의 식별자를 외래키로 참조한다. apply 테이블이 users 테이블의 데이터를 참조할 때 users 테이블의 데이터를 지우려고 하면 외래키 제약조건에 의해 에러가 발생할 것으로 예상된다. 테스트를 돌려서 확인해보자. 문제 UserEntity와 StudyEntity의 식별자로 ApplyEntity를 조회하는 기능의 단위 테스트를 작성했다. @Test void 유저식별자와_스터디식별자로_스터디요청_엔티티_조회() { // given UserEntity user = userRepository.save(UserEntityFixtur.. DB 인덱싱 성능 테스트 개요 스터디 허브 프로젝트의 성능 개선을 위해 DB 인덱스에 관해 학습하던 중 문득 성능 차이를 눈으로 보고싶다는 생각이 들어 직접 구현하게 되었습니다. 프로젝트 설계 DB 인덱스 성능 테스트가 목적이기 때문에 설계를 간단하게 구성했습니다. 데이터 입력은 아래와 같은 로직으로 진행됩니다. 1. 클라이언트가 Post 요청을 보낸다. 2. 서버측에서는 이를 받아 랜덤한 문자열을 가지는 UserEntity를 100만개를 생성한다. 3. DB에 UserEntity 100만개를 saveAll 메소드를 이용해 저장한다. 조회 성능 테스트 성능 테스트는 다음과 같은 방식으로 진행됩니다. 1. 인덱싱하지 않은 상태로 DB에서 name을 조회해 동일한 name이 있을 경우 반환한 뒤 수행 시간을 측정한다. 2. 인덱싱한.. 이전 1 다음