select 절에 * 는 모든 컬럼을 가지고 오기 때문에 성능 문제가 발생한다
따라서 불필요한 자원을 낭비하는 것
count(*): 단순 행을 세는 역할을 한다
(Mysql 내부적으로 데이터를 읽지않고 행의 갯수를 흝고 지나간다는 것)
count(컬럼): 행의 값을 세는 역할을 한다 (데이터를 읽는 것)
PRIMARY KEY 말고 인덱스가 하나도 없어도 적용할 인덱스가 없기 때문에 여전히 느립니다.
select count(*)
from t_like
where post_id = 1;
select count(like_id)
from t_like
where post_id = 1;
속도 : count(distinct(컬럼)) < count(컬럼) < count(*) 순서
불필요한 데이터를 셀 필요없이 행의 갯수만 얻고 싶다면 * 를 쓰는것이 빠르다
COUNT를 하려는 테이블의 총 로우 개수가 100개 미만이라면 COUNT가 더 빠르다.
100개 이상이면 sysindexes이 더 빠르다
(COUNT 키워드를 실행하게 되면 table scan
대체 쿼리에서는 해당 rows값을 가져오기 때문에 더 빠르다.)
따로 count index 컬럼을 만들어서 사용하는 방법도 있습니다
ex)
SELECT rows FROM sysindexes WHERE id = OBJECT_ID('TestTable') AND indid < 2;
SELECT @@profiling;
SET profiling=1;
select count(like_id)
from t_like
where post_id = 1;
SHOW profiles
측정 결과 count(*)가 더 빠르다
SHOW profile FOR QUERY 22;
SHOW profile CPU FOR QUERY 22;
📌 profile을 통해 조회할 수 있는 목록
참고 블로그