이전 목록 다음
채택완료

한개의 게시판에 글이 너무 많아서 느린데요 어떻게 해야할까요?

검색해봐도 좋은방법을 못찾아서요
데이터가 대략 댓글들이 많아서.. 100만건 정도 있는데요
이 게시판만 좀 느리거든요..
이럴떄 어떻게 하는지...
현재 명은 g5_write_qa 인데요
g5_write_qa_2025
g5_write_qa_2026

이런식으로 나눠야할까요??.. 어떻게 하죠.. 조언좀 부탁드립니다

|

답변 4개

채택된 답변
+20 포인트
연도별로 나누기 전에, 어느 쿼리에서 시간이 걸리는지부터 확인하시는 게 좋겠습니다. 목록 첫 페이지, 뒤쪽 페이지, 검색, 글 보기 중 느린 동작을 구분해 주세요. 전체 건수 조회(COUNT)와 목록 SELECT가 각각 병목일 수도 있습니다.

우선 기존 인덱스는 다음 조회로 확인할 수 있습니다.
Copy
SHOW INDEX FROM g5_write_qa;

그다음 실제 느린 SELECT 앞에 EXPLAIN을 붙여 key(선택된 인덱스), rows(예상 검사 행 수), Extra를 확인해 보세요. rows는 실제 처리 건수와 같지는 않습니다. 위 답변의 복합 인덱스도 실제 WHERE·ORDER BY와 기존 인덱스를 함께 보고 판단해야 하므로 바로 추가하기보다는 실행 계획을 비교하는 편이 좋습니다.

테이블을 연도별로 나누면 기존 목록·검색이 새 테이블까지 조회하도록 수정하고 댓글·첨부파일 연결도 점검해야 합니다. 우선은 테이블을 유지한 채 병목 쿼리를 찾는 것을 권합니다. DB 종류/버전, 개인정보를 제거한 느린 SQL, SHOW INDEX와 EXPLAIN 결과를 올려주시면 필요한 인덱스 방향을 더 구체적으로 판단할 수 있습니다.

EXPLAIN 참고: https://dev.mysql.com/doc/refman/8.4/en/explain.html

100만 건 정도면 무조건 테이블을 나눠야 하는 건 아닙니다.

일단 연도별로 나누기 전에 인덱스부터 확인해 보시는 게 좋을 것 같아요.

그누보드는 게시글이랑 댓글이 같은 테이블에 저장되는데, 데이터가 많아서 느린 건지 조회할 때 인덱스를 제대로 못 타서 느린 건지 먼저 확인해 봐야 합니다.

특히 게시판 목록이 느린 건지, 댓글 많은 글을 열 때 느린 건지, 검색할 때 느린 건지에 따라 해결 방법도 달라지고요.

연도별로 테이블을 나누면 기존 글 조회나 검색, 댓글 처리까지 수정할 부분이 생겨서 오히려 일이 커질 수 있습니다.

제 생각에는 우선 느린 쿼리 확인하고 인덱스 최적화부터 해보시는 게 좋겠습니다. 100만 건 정도면 테이블 분리 없이도 충분히 운영 가능한 경우가 많습니다.

연도별 테이블 분할은 가장 마지막에 검토하는 편이 안전합니다. 그누보드 게시판은 댓글도 같은 write 테이블을 쓰기 때문에, 100만 건이라는 숫자보다 실제로 느린 쿼리와 인덱스 사용 여부를 먼저 확인해야 합니다.

1) 목록 첫 페이지·뒤쪽 페이지·검색·글보기 중 어디가 느린지 구분합니다.
2) SHOW INDEX FROM g5_write_qa; 로 현재 인덱스를 확인합니다.
3) 느린 SELECT 앞에 EXPLAIN을 붙여 key, rows, Extra를 확인합니다.
4) WHERE와 ORDER BY에 맞는 복합 인덱스를 후보로 만든 뒤, 운영 DB 백업과 복제 환경에서 전후 시간을 비교합니다.

예를 들어 일반 목록이 wr_is_comment 조건과 wr_num/wr_reply 정렬을 쓴다면 관련 복합 인덱스가 도움이 될 수 있지만, 이미 비슷한 인덱스가 있거나 검색 조건이 다르면 쓰기 비용만 늘 수 있으므로 SQL과 EXPLAIN 없이 바로 추가하면 안 됩니다. 뒤쪽 페이지에서만 느리다면 큰 OFFSET도 원인일 수 있습니다.

연도별 분할은 기존 목록·검색·댓글·첨부파일·관리자 기능까지 여러 테이블을 조회하도록 수정해야 해서 유지보수 위험이 큽니다. 개인정보를 제거한 느린 SQL, SHOW INDEX, EXPLAIN 결과를 올려주시면 인덱스 방향을 더 정확히 좁힐 수 있습니다.
phpmyadmin 열어서 인덱스 를 해보시기 바랍니다.
ALTER TABLE g5_write_qa ADD INDEX idx_lookup (wr_is_comment, wr_num, wr_reply);

답변을 작성하려면 로그인이 필요합니다.