MySQL 의 COUNT(*)의 성능 에 대해 이야기 합 니 다.

4866 단어 MySQLCOUNT(*)
머리말
기본 적 인 직장 프로그래머 들 은 데이터베이스 시트 의 줄 수 를 통계 하 는 데 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(*)는 MySQL 조회 유 틸 리 티 에 의 해 count(0)로 바 뀌 었 고 idx 를 선택 하 였 습 니 다.status 인덱스
  • count(1)와 count(id)는 모두 idx 를 선택 하 였 습 니 다.statux 인덱스
  • force index(primary)를 추가 한 후 강제 색인 을 떠 났 다
  • 이 idxstatus 는 2 급 보조 색인 트 리 에 해당 합 니 다.이 노 DB 는 count(*)를 처리 할 때 보조 색인 트 리 가 있 는 경우 보조 색인 트 리 를 우선 선택 하여 총 줄 수 를 집계 합 니 다.
    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)를 과감하게 사용 할 수 있 습 니 다.
    참고 자료
  • (제3 판)제6 장 최적화 COUNT()조회
  • 임 효 빈MySQL 의 COUNT(*)의 성능 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 MySQL COUNT(*)내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 읽 어 주시 기 바 랍 니 다.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

    좋은 웹페이지 즐겨찾기