복붙노트

[SQL] MySQL의 카운트 성능

SQL

MySQL의 카운트 성능

select count(*) from mytable;
select count(table_id) from mytable; //table_id is the primary_key

두 쿼리는 1,000 만 행이 테이블에 느리게 실행되었다. 그 이유 때문에 쉽게 MySQL의 모든 삽입, 업데이트에 업데이트되는 카운터를 유지하고 삭제하지 않을 궁금? 이 쿼리를 개선 할 수있는 방법은 무엇입니까? 나는 설명을 사용하지만 훨씬 도움이되지 않았다.

해결법

  1. ==============================

    1.cherouvim이 코멘트에 지적한 바와 같이,이 스토리지 엔진에 따라 달라집니다.

    cherouvim이 코멘트에 지적한 바와 같이,이 스토리지 엔진에 따라 달라집니다.

    의 MyISAM은 테이블 행의 수를 계속 수행하고, 정확한 유일한 고정의 MyISAM 지원하는 테이블 잠금 때문에 유지할 수 있습니다.

    InnoDB는 그러나 트랜잭션을 지원하고, 필요 행을 계산하기 위해 테이블 ​​스캔을 할 수.

    http://www.mysqlperformanceblog.com/2006/12/01/count-for-innodb-tables/

  2. ==============================

    2.다음 블로그 게시물을 살펴 :

    다음 블로그 게시물을 살펴 :

    COUNT (COL VS 1) COUNT (***)) 2) 쉬운 MySQL의 성능 팁 이노 3) 고속 수 (*)

    BTW, 당신은 어떤 엔진을 사용합니까?

    편집 : 카운트 최대 속도 기술을 소개 할 때 당신은 행의 일부 금액이 있는지 알고 그냥 필요는 없다. 죄송합니다, 그냥 내 쿼리 문제였다. 예를 들어,이 경우에 따라서, 당신은 단지 필요로 할 때, 알고 당신이 하위 쿼리를 시도 할 수 있습니다 특정 조건 300 행 :

    select count(*) FROM
    ( select 1 FROM _table_ WHERE _conditions_ LIMIT 300 ) AS result
    

    처음에 당신은 설정을 초래하고 그 결과를 계산 작게하다; 이 검사 결과 세트 여전히 것이다, 그러나 당신이 그것을 제한 할 수 있으며, DB는 조건을 만족하는 300 개 이상의 행이 포함되어있는 경우 쿼리가 빠르다는 것을 (다시 한 번,이 DB에 문제가있을 때 "더 많거나 적은 300 행보다 여기에 작동)

    결과를 테스트 (내 표는 6.7mln 행이) :

    _table_ FROM 1) SELECT COUNT (*) WHERE START_DATE> '2011-02-01' 수익률은 65.4 초 동안 4.2mln

    2) SELECT COUNT (*) 발 (_table_ 결과 AS START_DATE> '2011-02-01'LIMIT 100)를 제 1 선택 0.03 초 동안 100 반환

    아래의 결과가에 무슨 일이 일어나고 있는지보고 쿼리 설명입니다 :

    EXPLAIN SELECT count(*) FROM ( select 1 FROM _table_ WHERE START_DATE > '2011-02-01' LIMIT 100 ) AS result
    

  3. from https://stackoverflow.com/questions/4871747/mysql-count-performance by cc-by-sa and MIT license