[mysql] MySQL : 행 수를 계산하는 가장 빠른 방법

MySQL에서 행 수를 계산하는 방법이 더 빠를까요?

이:

SELECT COUNT(*) FROM ... WHERE ...

또는 대안 :

SELECT 1 FROM ... WHERE ...

// and then count the results with a built-in function, e.g. in PHP mysql_num_rows()

첫 번째 방법은 분명히 데이터베이스 영역이고 내부적으로 이와 같은 것을 결정할 때 데이터베이스 엔진이 다른 어떤 사람보다 빠르기 때문에 첫 번째 방법이 더 빠르다고 생각할 것입니다.



답변

COUNT(*)카운트 열 인덱스를 가져 오면 최상의 결과가 될 것입니다. MyISAM 엔진을 사용하는 Mysql은 실제로 행 수를 저장하지만 모든 행을 계산하려고 할 때마다 모든 행을 계산하지는 않습니다. (기본 키 열 기준)

행을 계산하기 위해 PHP를 사용하는 것은 그리 현명하지 않습니다. mysql에서 php로 데이터를 보내야하기 때문입니다. mysql 측에서 동일한 결과를 얻을 수 있는데 왜 그렇게합니까?

(가) 경우 COUNT(*)천천히, 당신은 실행해야 EXPLAIN쿼리에 인덱스가 실제로 사용하는 경우 확인하고 그들이 어디에 추가해야합니다.


다음은 가장 빠른 방법 COUNT(*)은 아니지만 실제로 적합하지 않은 경우가 있습니다. 결과 그룹화를 시작하면 COUNT실제로 모든 행을 계산하지 않는 문제가 발생할 수 있습니다 .

해결책은 SQL_CALC_FOUND_ROWS. 일반적으로 행을 선택하지만 총 행 수를 알아야 할 때 (예 : 페이징) 일반적으로 사용됩니다. 데이터 행을 선택할 때 SQL_CALC_FOUND_ROWSSELECT 뒤에 키워드를 추가하십시오 .

SELECT SQL_CALC_FOUND_ROWS [needed fields or *] FROM table LIMIT 20 OFFSET 0;

필요한 행을 선택한 후 다음 단일 쿼리로 개수를 가져올 수 있습니다.

SELECT FOUND_ROWS();

FOUND_ROWS() 데이터 선택 쿼리 직후에 호출해야합니다.


결론적으로 모든 것은 실제로 얼마나 많은 항목이 있고 WHERE 문에 무엇이 있는지에 달려 있습니다. 행이 많을 때 (수만, 수백만 이상) 인덱스가 사용되는 방식에주의를 기울여야합니다.


답변

팀 동료들과 이야기를 나눈 후 Ricardo는 더 빠른 방법은 다음과 같다고 말했습니다.

show table status like '<TABLE NAME>' \G

그러나 결과가 정확하지 않을 수 있음을 기억해야합니다.

명령 줄에서도 사용할 수 있습니다.

$ mysqlshow --status <DATABASE> <TABLE NAME>

추가 정보 : http://dev.mysql.com/doc/refman/5.7/en/show-table-status.html

mysqlperformanceblog 에서 전체 토론을 찾을 수 있습니다.


답변

좋은 질문, 좋은 답변. 누군가이 페이지를 읽고 해당 부분을 놓친 경우 결과를 신속하게 표시하는 방법은 다음과 같습니다.

$counter = mysql_query("SELECT COUNT(*) AS id FROM table");
$num = mysql_fetch_array($counter);
$count = $num["id"];
echo("$count");


답변

이 쿼리 ( bayuah가 게시 한 것과 유사 )는 데이터베이스 내부의 모든 테이블 수에 대한 멋진 요약을 보여줍니다. ( Ivan Cachicatari 의 간단한 저장 프로 시저 버전으로 강력하게 추천합니다).

SELECT TABLE_NAME AS 'Table Name', TABLE_ROWS AS 'Rows' FROM information_schema.TABLES WHERE TABLES.TABLE_SCHEMA = '`YOURDBNAME`' AND TABLES.TABLE_TYPE = 'BASE TABLE'; 

예:

+-----------------+---------+
| Table Name      | Rows    |
+-----------------+---------+
| some_table      |   10278 |
| other_table     |     995 |


답변

아래 내용이 가장 빠른 응답 시간을 제공한다는 것을 항상 이해했습니다.

SELECT COUNT(1) FROM ... WHERE ...


답변

전체 결과 집합의 개수를 가져와야하는 경우 다음 접근 방식을 사용할 수 있습니다.

SELECT SQL_CALC_FOUND_ROWS * FROM table_name LIMIT 5;
SELECT FOUND_ROWS();

이것은 일반적으로 사용하는 것보다 빠르지는 않지만 COUNT내부적으로 계산을 수행하고 사용자에게 데이터를 다시 보내지 않으므로 성능 향상이 의심되기 때문에 반대의 경우라고 생각할 수 있습니다.

이 두 쿼리를 수행하는 것은 총계를 얻기위한 페이지 매김에는 좋지만 특히 WHERE절 을 사용하는 경우에는 적합하지 않습니다 .


답변

COUNT(*)vs COUNT(id)(id는 테이블의 기본 키-인덱싱 됨) 의 실행 시간을 비교하기 위해 몇 가지 벤치 마크 를 수행했습니다 .

시도 횟수 : 10 * 1000 쿼리

결과 :
COUNT(*)7 % 더 빠름

그래프보기 : 벤치 마크 그래프

내 조언은 다음을 사용하는 것입니다. SELECT COUNT(*) FROM table