MySQL 의 COUNT(*)의 성능 에 대해 이야기 합 니 다.
기본 적 인 직장 프로그래머 들 은 데이터베이스 시트 의 줄 수 를 통계 하 는 데 count(*),count(1)또는 count(메 인 키)를 사용 합 니 다.그렇다면 이들 의 차이 점 과 성능 을 알 고 있 습 니까?
사실 프로그래머 가 개발 하 는 과정 에서 큰 표 에서 본점 수 를 통계 하 는 것 은 매우 시간 이 걸 리 는 조작 이다.그러면 우 리 는 어떤 방법 으로 통계 하 는 것 이 더 빠 를 까?
다음은 MySQL 에서 총 행 수 를 집계 하 는 방법 과 성능 에 대해 이야기 해 보 겠 습 니 다.
count(*),count(1),count(메 인 키)중 어느 것 이 더 빠 릅 니까?
1.표를 작성 하고 1000 만 개의 데 이 터 를 삽입 하여 실험 테스트 를 한다.
#
CREATE TABLE `t6` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`status` tinyint(4) NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
# 1000w
CREATE PROCEDURE insert_1000w()
BEGIN
DECLARE i INT;
SET i=1;
WHILE i<=10000000 DO
INSERT INTO t6(name,status) VALUES('god-jiang-666',1);
SET i=i+1;
END WHILE;
END;
# , 1000
call insert_1000w();
2.실험 결 과 를 분석한다.
# 0.572
select count(*) from t6;
# 0.572
select count(1) from t6;
# 0.580
select count(id) from t6;
# 0.620
select count(*) from t6 force index (primary);
위의 실험 을 통 해 알 수 있 듯 이 count(*)와 count(1)가 가장 빠 르 고 그 다음은 count(id)이 며 가장 느 린 것 은 count 가 강제 키 를 사용 한 경우 입 니 다.
다음은 각자 의 실행 계획 을 계속 테스트 해 보 겠 습 니 다.
explain select count(*) from t6;
show warnings;
explain select count(1) from t6;
show warnings;
explain select count(id) from t6;
show warnings;
explain select count(*) from t6 force index (primary);
show warnings;
위의 실험 에서 이 세 가 지 를 얻 을 수 있다.
count(*)를 검증 하기 위해 보조 색인 트 리 라 는 결론 을 우선 선택 합 니 다.다음 실험 을 계속 살 펴 보 겠 습 니 다.
# idx_status , count(*)
alter table t6 drop index idx_status;
explain select count(*) from t6;
이상 의 실험 을 통 해 알 수 있 듯 이 idx 를 삭제 하 였 습 니 다.status 라 는 보조 색인 트 리 는 count(*)에서 홈 키 색인 을 선택 합 니 다.따라서 결론:count(*)는 보조 색인 을 우선 선택 합 니 다.보조 색인 이 존재 하지 않 으 면 홈 키 색인 으로 갑 니 다.
왜 count(*)는 보조 색인 을 우선 선택 합 니까?
MySQL 5.7.18 이전에 InnoDB 는 색인 을 스 캔 하여 count(*)문 구 를 처리 합 니 다.
MySQL 5.7.18 부터 InnoDB 는 count(*)문 구 를 최소 2 단계 색인 으로 처리 합 니 다.2 급 색인 이 존재 하지 않 으 면 집합 색인 을 검색 합 니 다.
새 버 전 은 왜 2 급 색인 으로 count(*)를 처리 합 니까?
InnoDB 2 급 색인 트 리 의 잎 사 귀 노드 에는 메 인 키 가 저장 되 어 있 고,메 인 키 색인 트 리 의 잎 사 귀 노드 는 전체 줄 의 데 이 터 를 저장 하기 때문에 2 급 색인 트 리 는 메 인 키 색인 트 리 보다 작다.따라서 검색 최적화 기 는 원가 고려 를 바탕 으로 2 급 색인 을 우선 선택한다.그래서 색인 count(*)는 count(메 인 키)보다 빠르다.
총결산
이 글 의 결론 은 count(*)=count(1)>count(id)이다.
왜 count(id)가 가면 메 인 키 색인 이 더 느 릴 까요?count(id)는 메 인 키 를 꺼 내 서 비어 있 지 않 고 누적 되 어 대가 가 더 높 기 때 문 입 니 다.
count(*)는 모든 NOT NULL 과 NULL 의 필드 를 계산 합 니 다.count(id)는 NULL 필드 를 통계 하지 않 기 때문에 우 리 는 표를 만 드 는 데 가능 한 한 NOT NULL 을 사용 하고 기본 값 이 비어 있 으 면 됩 니 다.
마지막 으로 앞으로 총 데이터베이스 시트 의 총 줄 수 를 계산 할 때 count(*)또는 count(1)를 과감하게 사용 할 수 있 습 니 다.
참고 자료
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Redash를 사용할 때 몰랐던 SQL을 쓰는 법을 배웠습니다.최근 redash에서 sql을 쓸 기회가 많고, 이런 쓰는 방법이 있었는지와 sql에 대해 공부를 다시하고 있기 때문에 배운 것을 여기에 씁니다. Redash란? 월별로 데이터를 표시하고 싶습니다 주별로 데이터를 표...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.