본문 바로가기
MySql

MySQL 테이블이 비어 있는지 확인하십시오. COUNT (*)가 0 대 LIMIT (0,1) 결과가 있습니까?

by 베이스 공부 2020. 12. 7.
반응형

이것은 특히 MySQL 구현과 관련된 효율성에 대한 간단한 질문입니다. 테이블이 비어 있는지 확인하고 싶습니다 (비어 있으면 기본 데이터로 채 웁니다). SELECT COUNT (*) FROM`table` 과 같은 문을 사용한 다음 0과 비교하는 것이 가장 좋을까요, 아니면 SELECT`id` FROM`과 같은 문을 수행하는 것이 더 좋을까요? table` LIMIT 0,1 그런 다음 결과가 반환되었는지 확인하십시오 (결과 집합에 다음이 있음)?

내가 작업중인 프로젝트에 이것이 필요하지만, MySQL이이 두 명령문에서 어떻게 작동하는지, 그리고 사람들이 COUNT (*) 사용을 제안하는 이유가 결과가 캐시되기 때문인지 여부에도 관심이 있습니다. 또는 실제로 모든 행을 통과하고 직관적으로 보이는 것처럼 카운트에 추가되는지 여부.

 

해결 방법

 

첫 번째 쿼리가 아닌 두 번째 쿼리를 사용해야합니다.

COUNT (*) 를 사용할 때 MySQL은 적어도 하나의 인덱스를 스캔하고 레코드를 계산합니다. 호출을 LEAST () ( SELECT LEAST (COUNT (*), 1) FROM table; ) 또는 IF () <로 래핑하더라도 / code>, MySQL은 추가 평가 전에 COUNT () 를 완전히 평가합니다. InnoDB가 사용될 때 MySQL이 COUNT (*) 결과를 ​​캐시한다고 생각하지 않습니다.

두 번째 쿼리는 하나의 행만 읽히고 색인이 사용됩니다 (id가 하나의 일부라고 가정). 행이 반환되었는지 확인하는 방법을 알아 보려면 드라이버 설명서를 참조하십시오. 그런데 id 필드는 쿼리에서 생략 될 수 있습니다 (MySQL은 임의의 인덱스를 사용합니다) :

SELECT 1 FROM table LIMIT 1;

그러나 가장 간단하고 가장 성능이 좋은 해결책은 다음과 같습니다 (Gordon의 답변에 나와 있음).

SELECT EXISTS (SELECT 1 FROM table);

EXISTS 는 하위 쿼리가 하나의 행을 반환하면 1 을 반환하고 그렇지 않으면 0 을 반환합니다. 이 의미 론적 MySQL 때문에 실행을 적절하게 최적화 할 수 있습니다. 하위 쿼리에 나열된 모든 필드는 무시되므로 일반적으로 1 또는 * 가 작성됩니다.


 

참조 페이지 https://stackoverflow.com/questions/23063327

 

 

반응형

댓글