티스토리 뷰

DB/Mysql

mysql count 쿼리 성능

길나미 2018. 8. 7. 09:57
  • InnoDB does not keep an internal count of rows in a table because concurrent transactions might see different numbers of rows at the same time. 
    Consequently, SELECT COUNT(*) statements only count rows visible to the current transaction.

    InnoDB processes SELECT COUNT(*) statements by scanning the clustered index.
    Processing SELECT COUNT(*) statements takes some time if index records are not entirely in the buffer pool. 
    For a faster count, you can create a counter table and let your application update it according to the inserts and deletes it does. 
    However, this method may not scale well in situations where thousands of concurrent transactions are initiating updates to the same counter table. If an approximate row count is sufficient, SHOW TABLE STATUS can be used.

  • InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.



InnoDB에서는 정확한 테이블의 현재로우수를 확인할 수 없다. 병렬로 처리되기 때문에(라고 해석하면 될까)

select count(*) 쿼리는 현재 실행된 트랜젝션에서의 로우수만 확인해준다. 

-> 동시간에 동일 쿼리를 날려도 결과는 다를수 있다는 의미


정확하게 빨리 count를 확인하고 싶으면 차라리 counter table 만들어서 어플리케이션단에서 카운팅을 할수 있게끔 만들어라.

하지만, 쉽지 않지. 동시처리되는 트랜젝션이 많아지면 counter table에 관리하기가 힘들거다. 

show table status를 통해서 처리하는것도 한가지 방법이 될것이다. 

-> 이런식으로 찾을 수 있다. select TABLE_ROWS From INFORMATION_SCHEMA.tables where table_name = '테이블명';


InnoDB에서는 select count(*)와 count(1) 작동방식은 같다. 성능적으로 다른게 없다. 



출처 및 참고) https://dev.mysql.com/doc/refman/8.0/en/innodb-restrictions.html


'DB > Mysql' 카테고리의 다른 글

Mysql Index 인덱스란  (0) 2017.01.27
댓글