안녕하세요 게시판을 만들다가 성능관련 쿼리 문의 드립니다
아래 3개의 테이블이 있습니다.
BOARD(T)
board_id | board_titl | board_content |
---|---|---|
1 | test1 | test2 |
2 | test3 | test4 |
LIKE(T)
like_id | board_id | user_id |
---|---|---|
1 | 1 | 1 |
2 | 2 | 1 |
3 | 1 | 2 |
REPLY(T)
reply_id | board_id | reply_content |
---|---|---|
1 | 2 | test1 |
2 | 2 | test2 |
3 | 1 | test3 |
해당 테이블의 연관된 컬럼은 board_id입니다.
이런테이블 구조로 조회를 할때 각 게시글의 좋아요수, 댓글수를 구하는 조회 쿼리를 짜려고했습니다.
그런데 문득 생각이 난게
현재는 문제 없지만 만약에 좋아요 테이블, 댓글 테이블이 데이터가 엄청 많아진다면 성능에 문제가 생기지 않을까 싶어서
문의 드립니다. 제가 사용한 쿼리는 아래와 같습니다.
select a.board_id, a.board_title, (select count(*) from like b where b.board_id = a.board_id) as like_cnt, (select count(*) from reply c where c.board_id = a.board_id) as reply_cnt from board a
해당 쿼리를 날리면 좋아요, 댓글수는 서브쿼리로 날리면 전체 테이블을 Full스캔을 하여 테이블에 데이터가 많아지면 많아질수록 성능적으로
퍼포먼스가 안나올거같다는 생각이 들었는데요
혹시 이걸 개선 또는 튜닝을 어떤식으로 효과적으로 해야할지 고민이 되서 질문남깁니다.
데이터베이스는 MySQL입니다.
감사합니다 마농님
페이징을 현재 사용하고 있는데요
인덱스가 가정이 있다는 전재하에 쿼리를 작성해보면
select a*, (select count(*) from like b where b.board_id = a.board_id) as like_cnt, (select count(*) from reply c where c.board_id = a.board_id) as reply_cnt from( select board_id, board_title from board limit 30 ) a
위의 쿼리처럼 된다면 성능개선이 좀더 효과적일까요>?