MySQL에서 테이블 행 수 카운트의 비용과 인덱스의 역할 이해하기

MySQL 테이블 행 수 카운트의 비용은 얼마일까?

안녕하세요, 여러분! 오늘은 MySQL에서 테이블의 행 수를 세는 비용이 실제로 얼마나 되는지에 대해 알아보겠습니다. MySQL 사용자라면, 데이터베이스의 성능 또는 최적화 관점에서 이 질문이 얼마나 중요한지 잘 알고 계실 것입니다.

COUNT(*) 사용 시 인덱스는 어떻게 작동할까?

MySQL의 공식 문서에 따르면, InnoDB는 SELECT COUNT() 문을 실행할 때 사용 가능한 가장 작은 보조 인덱스를 탐색하게 됩니다. 만약 보조 인덱스가 없다면, InnoDB는 클러스터드 인덱스를 스캔하여 COUNT()를 처리합니다.
그럼 이러한 카운팅 쿼리의 비용은 어떻게 측정할 수 있을까요? 아래에 간단한 sysbench 테이블 예제를 통해 살펴보겠습니다.

mysql > explain select count(*) from sbtest1;

위 쿼리를 실행하면, 쿼리 최적화기가 보조 인덱스를 선택하여 해당 인덱스를 스캔할 것임을 알 수 있습니다.

이제 이 쿼리를 실행해 보겠습니다:

mysql > select count(*) from sbtest1;

아래와 같은 결과를 얻게 됩니다.

+----------+
| count(*) |
+----------+
| 1000000  |
+----------+

여기서 중요한 점은 '행 수'에 대한 결과를 반환하는 동안, 'Handlers' 변수도 함께 확인하면 어떠한 인덱스가 읽혔는지 알 수 있다는 것입니다.

선택적 키가 없을 때는?

다음으로, 보조 키가 없는 테이블을 살펴보겠습니다. 이러한 경우에는 쿼리가 클러스터드 인덱스를 사용하게 됩니다.

mysql > explain select count(*) from sbtest2;

이번에도 쿼리는 예상한 대로 클러스터드 인덱스를 사용하게 됩니다. 실행 후 확인해보면 Handlers가 변경되지 않는다는 것을 발견하게 됩니다.

위의 쿼리를 통해, 오늘 우리가 복잡한 테이블에서 SELECT COUNT(*) 구문이 어떻게 작동하는지 분석해 보았습니다. 이 과정을 통해, 다양한 인덱스 유무에 따라 쿼리 성능이 어떻게 달라지는지를 이해할 수 있었습니다.

결론

InnoDB에서 인덱스와 관련된 정보를 확인하는 것은 매우 중요한 작업입니다. 특히 COUNT(*)와 같은 쿼리는 성능 최적화에 많은 영향을 미칠 수 있습니다. MySQL 5.7과 8.0에서는 쿼리 수행과 관련된 통계량이 어떻게 달라지느냐에 따라서 향후 데이터베이스 성능 분석 및 최적화에 유용한 인사이트를 제공할 수 있습니다.

여기까지 읽어주셔서 감사합니다! 데이터베이스 관리에 대한 궁금증이나 다른 질문이 있다면 댓글로 남겨주세요. 다음 포스팅에서 다시 만나요!

MySQL


저자: Przemysław Malkowski
Przemek은 2012년 Percona 지원 팀에 합류하였으며, 그 이전에는 Wikia.com에서 시스템 관리자로 근무하면서 MySQL 기반 데이터베이스 인프라를 관리했습니다.

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다