카테고리 없음

[sql] 속도? count(*) > count(컬럼) > count(distinct(컬럼)) (100개 이상이면 sysindexes)

보리시스템 2024. 2. 27.

java 코드를 nodejs로 바꾸면서 총결산 조회하는 api에서 12초나 걸리는 말도 안되는 일이 있었다. 여러 종류의 금액을 연산하는 것 때문인가 싶어서 인덱스를 이렇게도 해보고 저렇게도 해봤는데 여전히 12초!

이 코드 저 코드 다 주석처리 해보며 어디에 원인이 있나 찾아보니 count 부분 때문이었다. 

아래의 출처 링크에서 얻은 정보는 이러하다.

1. count(*): 단순 행을 세는 역할을 한다(Mysql 내부적으로 데이터를 읽지않고 행의 갯수를 흝고 지나간다는 것)
2. count(컬럼): 행의 값을 세는 역할을 한다 (데이터를 읽는 것)

속도 : count(distinct(컬럼)) < count(컬럼) < count(*) 순서
1. 불필요한 데이터를 셀 필요없이 행의 갯수만 얻고 싶다면 * 를 쓰는것이 빠르다
2. COUNT를 하려는 테이블의 총 로우 개수가 100개 미만이라면 COUNT가 더 빠르다.
3. 100개 이상이면 sysindexes이 더 빠르다(COUNT 키워드를 실행하게 되면 table scan대체 쿼리에서는 해당 rows값을 가져오기 때문에 더 빠르다.)
4. 따로 count index 컬럼을 만들어서 사용하는 방법도 있습니다
ex)
SELECT rows FROM sysindexes WHERE id = OBJECT_ID('TestTable') AND indid < 2;

 

https://velog.io/@may_yun/sql-count-%EC%BF%BC%EB%A6%AC-%EC%84%B1%EB%8A%A5-%EA%B0%9C%EC%84%A0-%EC%BF%BC%EB%A6%AC-%EC%84%B1%EB%8A%A5-%EC%B8%A1%EC%A0%95

 

[sql] count(*) 쿼리 성능 / 쿼리 성능 측정

select 절에 \* 는 모든 컬럼을 가지고 오기 때문에 성능 문제가 발생한다따라서 불필요한 자원을 낭비하는 것count(\*): 단순 행을 세는 역할을 한다(Mysql 내부적으로 데이터를 읽지않고 행의 갯수를

velog.io

 

https://blog.naver.com/birdparang/221574304831

 

[MariaDB(MySQL)] "SELECT COUNT(*)" 수행 속도 문제

가끔 "무료로 쓸 수 있는 MariaDB(또는 MySQL)는 MSSQL이나 Oracle과 같은 비싼 제품과 비교...

blog.naver.com

 

https://kkeolmusae.tistory.com/94

 

[번역] MySQL 쿼리 속도를 높이고 실행 속도를 줄이는 10가지 방법

원문 https://seo-explorer.io/blog/five-ways-to-improve-mysql-select-speed-part-1/#Server_and_hardware_selection_for_MySQL_server_database Ten ways to increase MySQL query speed and decrease running speed - SEO Explorer's Blog We spent three months tweaki

kkeolmusae.tistory.com