table 의 row수를 카운트하는법


안녕하세요 !

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

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

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

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

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

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

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

  • 2016년 05월 03일에 작성됨

조회수 2617


3 답변


좋아요
4
싫어요
채택취소하기

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

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

  • 2016년 05월 04일에 작성됨
    Polyglot Programmer

  • 감사합니다!    김진혁   2016.5.9 00:33     

적어주신 방법으로는 정확한 행의 수를 구할 수 없습니다.

질문 내용으로 보아 스토리지엔진은 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

  • 2016년 05월 04일에 수정됨
    프로그래밍 언어를 좋아하는 프로그래머
  • 2016년 05월 04일에 작성됨
    프로그래밍 언어를 좋아하는 프로그래머


통상 이러한 고민을 할 때에는 첫 번째로 호환성 혹은 이식성 문제, 이 경우에는 "향후 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

  • 2016년 05월 04일에 수정됨
    리눅스(유닉스) 기반의 시스템에서 웹 서비스를 개발하고 있습니다.
  • 2016년 05월 03일에 작성됨
    리눅스(유닉스) 기반의 시스템에서 웹 서비스를 개발하고 있습니다.

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

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close