본문 바로가기
320x100
728x90

SQL4

MySQL의 Full-text index를 이용하여 검색 API 성능 개선하기 사내에서 테스트 커뮤니티 매체를 만들고 있는데, 테스트성으로 만든 매체다보니, 커뮤니티의 게시글을 검색하는 API에서 Like '%검색어%' 절로 간단하게 작성해 놨다. 그러다 보니 트래픽이 분당 500~700 사이었는데도 불구하고 RDS의 cpu가 항상 95~98%로 상당히 많은 부하가 있었다. 어찌 보면 당연한 결과다. like절은 인덱스를 타지 않고 기본적으로 풀스캔으로 동작을 하게 된다. 데이터는 약 16만 건의 row가 있었다. EXPLAIN SELECT * FROM contents c WHERE title LIKE '%검색어%'; explain으로 쿼리 전략을 살펴보면 모든 row를 스캔하고 그 대상은 약 13만 건의 데이터임을 알 수 있다. 사용자가 실제로 분당 30~40건의 검색 API를 .. 2023. 1. 16.
SQL] 쿼리로 페이지네이션 하는 방법 (페이징) 커뮤니티 게시판같은 곳에서 게시물이 10개씩 페이지로 이루어진 화면은 모두 많이 봤을 것이다. 이러한 게시물들은 보통 게시물을 최신순으로 10개 혹은 20개씩 페이지를 구성한다. 이럴경우 페이지의 인덱스를 같이 넘겨주면 동적 쿼리로 쉽게 해결이 가능하다. 자주 들리는 사이트를 예로 든다. http://www.gezip.net/bbs/board.php?bo_table=best 해당 URL에 접속하면 가장 최신으로 업로드된 순으로 게시물을 정렬하고 20개를 표시한다. 그리고 페이지를 붙여 2페이지면 다음 20개를 표시한다. http://www.gezip.net/bbs/board.php?bo_table=best&page=2 이런 형태를 쿼리로 나타내면 SELECT * FROM {table} ORDER BY {.. 2021. 8. 4.
인덱스에 대해서 알아보자 예전에 진행하던 프로젝트에선 db의 크기가 크지 않아서 인덱스의 필요성을 못 느꼈는데, 업무를 진행하면서 api를 통한 트랜잭션의 처리를 많이 경험해보면서 트랜잭션의 처리 속도가 곧 ux와 이어져 서비스의 품질을 결정하겠구나 라는 생각을 가질 정도로 느린 트랜잭션 속도는 사용자로 하여금 굉장한 답답함을 느끼게 한다. 모든 시스템이 그렇듯 사이즈가 커지면 속도가 느려지는 건 당연하다. 그렇다고 해서 RDB가 제공하는 데이터의 신뢰성과 무결성을 포기할 수는 없다. 그리고 규모가 커진 서비스들도 속도를 포기할 수 없는 노릇이다. 1. 인덱스란 인덱스란 RDBMS의 검색 속도 향상을 위한 방법이다. 테이블의 칼럼을 색인해서 따로 파일로 저장을 하고, 테이블을 검색할 때, 해당 테이블을 전체 스캔하지 않고, 따로.. 2021. 2. 15.
쿼리 속도 향상을 위한 방법들 공부용으로 생각날 때마다, 배울 때마다 추가하자. 1. select를 할 때는 필요한 데이터만 뽑는다. 예를 들면 select * from student; 보다는 select name,age,class from student;를 하는 방법이다. 이렇게 되면 IO가 줄어들면서 DB의 쿼리에 성능을 효과적으로 사용할 수 있다. 애초에 테이블 자체가 row가 많이 없다면 상관없지만 양이 많아지면 5초가 지나도 결과가 안 나오는 경우가 많다. 2.like ='%something%'을 사용할 때는 %를 가급적 뒤에만 붙이자. %를 앞에 붙이게 되면 ~로 시작하는 문자열을 다 검색해야 해서 연산의 시간이 증가하지만 뒤에만 붙이게 되면 특정 문자열 이후의 값들만 검색하면 되므로 불가피할 경우가 아니라면 문자열 검색의.. 2021. 2. 14.
300x250
320x100