이것은 특히 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
'MySql' 카테고리의 다른 글
MySQL 오류 "DEFAULT 절에 CURRENT_TIMESTAMP가있는 TIMESTAMP 열이 하나만있을 수 있습니다."내가 잘못하지 않은 경우에도 (0) | 2020.12.07 |
---|---|
MySQL 정의되지 않은 클래스 상수에 정의되지 않은 클래스 상수 'MYSQL_ATTR_INIT_COMMAND'(PHP 5.5.3) (0) | 2020.12.07 |
MySQLi와 같은 PDO Fetch Array (0) | 2020.12.07 |
MySQL Redis 데이터를 MySQL에 동기화하는 가장 좋은 전략은 무엇입니까? (0) | 2020.12.07 |
MySQL Codeigniter는 db에서 행 삭제 (0) | 2020.12.07 |
댓글