개발 Q&A

제목 게시판 제작시 DB에서 데이터 불러오는 쿼리 관련해서 질문 드립니다.
글쓴이 온더탑 작성시각 2014/08/08 12:42:26
댓글 : 8 추천 : 0 스크랩 : 0 조회수 : 13005   RSS
안녕하세요. 쿼리 관련해서 문의드립니다.
게시판 리스트를 구성할 때 DB에서 데이터를 뽑아와야 하는데요.
게시물이 100,1000개 일때는 속도에 대한 문제가 없는데 게시물 수가 1000000개쯤 더미 데이터를 넣고
mysql workbench에서 돌려보니 대략 4,5초 이상 걸리고 CI에서 돌려보니 대략 25초쯤 돌다가 멈춰버리네요.

모델에서 게시판 글을 불러오는 부분입니다.
$this->db->order_by('idx', 'desc');
return $this->db->get('weshop_notice')->result();

DB 필드명은 다음과 같습니다.
idx | writer | title | content | time | views | reply | voteup | votedown
필드가 몇개 되지 않아서 일단 다 불러왔습니다.

여기서 질문 드립니다.
보통 게시판에서 20개의 리스트로 한페이지가 구성되어 있는데요.
그럼 실질적으로 20개의 데이터만 가져오면 페이지를 구성할 수 있는데
페이징을 구성하려면 총 게시물 수를 알아야하고 게시물수를 가져오려면 전체 게시물을 가져와야 총 게시물
수를 알수있는데 너무 비효율 적인거 같아서요. 쿼리 시간도 오래걸리고요.

전체 게시물수를 관리하는 필드를 만들어 놓고 거기에 카운트로 올린다거나
그래서 최근 게시물 20개를 가져오고 페이징은 카운트에서 가져와서 구성한다거나

하지만 검색이 들어간다면 총 게시물에서 검색을 해야할텐데 인덱스를 붙이고 검색을 한다쳐도
100만개 이상의 게시물이 쌓여있다면 이것또한 시간이 많이 걸릴것 같아서 어떻게 구성해야 할까 고민중입니다.

다른분들은 이런 게시판 리스트 쿼리를 어떻게 구성하는지와 검색시 쿼리를 어떻게 처리하는지 궁금합니다.
 
 다음글 부트스트랩 사용하시는 분들은 웹브라우저 어디까지 지원하... (1)
 이전글 다음 코드 중 어느것이 더 정확하고 올바르며 빠르고 보... (8)

댓글

한대승(불의회상) / 2014/08/08 12:58:19 / 추천 0
단순히 게시물의 총수만 알고 싶다면
$this->db->count_all();
하면 됩니다.

단, 이 함수는 where절에 상관없이 항상 총수만 리턴하므로 where절을 사용하고 싶다면 아래 처럼 해주세요.
$this->db->where('a',1);
$this->db->count_all_results();
온더탑 / 2014/08/08 13:09:10 / 추천 0
전체를 다 돌지 않아도 총수를 알 수 있네요. 레퍼런스를 더 꼼꼼히 봤어야 하는데 감사합니다.
검색의 경우는 전체 게시물을 다 돌아야 알 수 있는거겠죠.

 
letsgolee / 2014/08/08 15:40:40 / 추천 0
검색의 경우는 디비가 알아서 할 일이고 인덱스 설정은 하셨나요?
온더탑 / 2014/08/08 15:44:19 / 추천 0
네 인덱싱은 해줬는데 게시물이 400만개가 조금 넘어서
전체 게시물 수를 가져오는데 2.7초
글을 가져오는데 24초 정도 걸리더라구요.

//전체 게시물 수 가져오기
    function total()
    {
        return $this->db->count_all('weshop_notice');
    }

    // 글가져오기
    function get($stNum, $offset)
    {
        $this->db->limit($stNum, $offset);
        $this->db->order_by('idx', 'desc');
        return $this->db->get('weshop_notice')->result();
    }
letsgolee / 2014/08/08 16:37:06 / 추천 0
정상적인 경우 게시물이 아무리 많아도 전체 게시물 수를 가져오는데 그렇게 오래 걸리지 않는다고 생각하는데... 이상하네요. 마찬가지로 글을 가져오는 데 24초라고 했는데 글을 얼마나 많이 가져오나요??? 그리고 인덱스를 건 필드를 알고 싶네요.
온더탑 / 2014/08/08 17:02:51 / 추천 0
letsgolee님 답변 감사합니다.
위의 쿼리문데로 정렬 기준이되는 idx필드에 유니크 프라이머리키로 인한 자동인덱싱이 되어있습니다.
DB가 어떻게 동작하는지 모르지만 전체 게시물 갯수를 알아내는데 2.7초인데 글을 가져오는게 24초나 걸려서
음 실제로는 이것보다 훨씬 짧은 시간이 걸려야하는게 맞는거죠 DB는 Mysql입니다.
들국화 / 2014/08/08 17:20:05 / 추천 0
구조만 잘 짜면 1억개가 넘어도 1초 미만으로 충분히 가져올수 있습니다.
인덱스를 만들면 보통은 속도가 낳아지지만 오히려 불리할 경우도 많습니다.
쿼리 실행계획을 보세요. 거기에 답이 다 있습니다.
온더탑 / 2014/08/08 17:41:11 / 추천 0
들국화님 답변 감사합니다.
쿼리 실행계획 이란걸 지금 첨 알았네요.
학습해 봐야겠어요.