table 의 row수를 카운트하는법

조회수 46954회

안녕하세요 !

mysql 의 테이블에서 총 갯수를 알고싶을때

count(*)를 사용하면 데이터가 많을때 너무 느립니다...

select TABLE_ROWS from information_schema.tables where table_name = '테이블이름';

이런식으로 하면 row수를 얻을 수는 있는데요.

이 방법으로 어플리케이션 서버에서 디비로 이 쿼리날려서 글 개수를 얻는 것은 비정상적인 방법인가요?

잘하지 않는방법 같습니다..ㅜ

문제가있다면 어떤문제가 있는지 알려주시면 감사하겠습니다!!.

3 답변

  • 좋아요

    4

    싫어요
    채택 취소하기

    실시간으로 데이터를 가져와야하는 애플리케이션에서 select count(*) from tables와 같은 쿼리를 하면 데이터 건수가 적을 때에는 문제가 없지만 많아지면 많아질수록 성능상 문제가 커집니다. 그래서 일반적으로 전체 데이터 건수를 저장하기 위한 별도 테이블을 두어서 해결합니다.

    예를 들어 게시판 애플리케이션에서는 게시판 목록을 가져오기 위해 게시판 건수 테이블을 만들어서 게시물을 insert할 때마다 +1을 하고, delete할 때 -1을 하는 식입니다. 그리고, 게시물 insert 쿼리와 건수 update 쿼리를 하나의 트랜잭션으로 묶어서 데이터 무결성을 보장해야 하구요.

    • (•́ ✖ •̀)
      알 수 없는 사용자
  • 적어주신 방법으로는 정확한 행의 수를 구할 수 없습니다.

    질문 내용으로 보아 스토리지엔진은 innodb일 것이라 생각되는데, 이 경우에 로우를 정확하게 세는 방법은 select count(*) from table 외에는 없습니다.

    정확하지 않은 점을 감내하더라도, 특정 조건에 맞는 로우를 선별할 수 없기 때문에 페이징 등에 활용되기에는 어려움이 있습니다.

    For InnoDB tables, the row count is only a rough estimate used in SQL optimization. (This is also true if the InnoDB table is partitioned.)

    Information-functions

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • (•́ ✖ •̀)
      알 수 없는 사용자
  • 통상 이러한 고민을 할 때에는 첫 번째로 호환성 혹은 이식성 문제, 이 경우에는 "향후 MySQL이 아닌 데이터베이스를 사용하여 운용할 가능성이 있는가?"에 대한 대답에 따라 달라질 수 있습니다.

    만약 MySQL만 사용할 예정이라면, 두 번째로 고민할 사항이, "전체 레코드 갯수를 아는 것이 궁금한 것인지?", "특정 조건에 의해 검색된 결과의 수가 궁금한 것인지?"에 따라 다르겠네요.

    우선 질문에 담긴 질의는 "전체 레코드 수"만 알 수 있습니다. 테이블에서 특정 조건에 맞는 레코드(예: 제목에 "키워드"가 포함된 글)의 수를 파악할 수는 없으므로, 다시 같은 문제에 직면하게 됩니다.

    단순하게 봤을 때, 이식 가능성이 없고(혹은 포기하고), 전체 레코드 수를 아는 것이 중요한 목표라면 그대로 사용하면 될 것 같습니다.

    수정 답변

    https://dev.mysql.com/doc/refman/5.7/en/tables-table.html

    For InnoDB tables, the row count is only a rough estimate used in SQL optimization. (This is also true if the InnoDB table is partitioned.)

    InnoDB 타입의 경우 성능상 이유로 러프하게(대충) 계산(추정)한 정보를 제공한다고 문서에 써있네요.

    TABLE_ROWS (and perhaps some other columns in INFORMATION_SCHEMA.TABLES) may get out of sync with the current table contents, but you can update it by running ANALYZE.

    그리고 ANALYZE 문을 실행할 때, 다시 갱신한다고 합니다.

    그리고 다음 글을 한번 참고해보세요.

    http://www.tocker.ca/2013/05/02/fastest-way-to-count-rows-in-a-table.html

    • 혹시 이 쿼리로 얻는 숫자가 실제 row수랑은 정확한지, 어떤 차이가 있는건 아닌지 여쭤봐도 될까요? 김진혁 2016.5.3 22:49
    • 감사합니다~!! 김진혁 2016.5.9 00:33

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

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)