MySQL은 SQL_CALC_FOUND_ROWS
8.0.17 이후 버전에서 기능을 더 이상 사용하지 않습니다 .
따라서 항상을 사용 하여 쿼리를 실행 LIMIT
한 다음 추가 행이 있는지 여부를 결정 COUNT(*)
하지 않고 두 번째 쿼리를 실행하는 것이 좋습니다LIMIT
.
에서 문서 :
SQL_CALC_FOUND_ROWS 쿼리 수정 자와 함께 제공되는 FOUND_ROWS () 함수는 MySQL 8.0.17부터 더 이상 사용되지 않으며 향후 MySQL 버전에서 제거 될 예정입니다.
COUNT (*)는 특정 최적화 대상입니다. SQL_CALC_FOUND_ROWS로 인해 일부 최적화가 비활성화됩니다.
대신 다음 쿼리를 사용하십시오.
SELECT * FROM tbl_name WHERE id > 100 LIMIT 10;
SELECT COUNT(*) WHERE id > 100;
또한 MySQL WL # 12615SQL_CALC_FOUND_ROWS
에서 설명한 것처럼 일반적으로 더 많은 문제가있는 것으로 관찰되었습니다 .
SQL_CALC_FOUND_ROWS에는 여러 가지 문제가 있습니다. 우선, 느립니다. COUNT ( )가 전체 결과 세트를 검색 할 때 수행 할 수없는 최적화 (예 : 파일 정렬)를 사용할 수 있으므로 LIMIT을 사용하여 쿼리를 실행 한 다음 동일한 쿼리에 대해 별도의 SELECT COUNT ( )를 사용하는 것이 더 저렴합니다. COUNT (*)에 대해서는 건너 뛸 수 있지만 CALC_FOUND_ROWS에서는 올바른 결과를 보장하기 위해 일부 파일 정렬 최적화를 비활성화해야합니다)
더 중요한 것은 여러 상황에서 의미가 매우 불분명하다는 것입니다. 특히 쿼리에 여러 쿼리 블록이있는 경우 (예 : UNION) 유효한 쿼리를 생성하는 것과 동시에 "있을 것"행 수를 계산할 수있는 방법이 없습니다. 반복자 실행자가 이러한 종류의 쿼리를 향해 진행함에 따라 동일한 의미를 유지하는 것은 실제로 어렵습니다. 또한 쿼리에 여러 LIMIT가있는 경우 (예 : 파생 테이블의 경우) SQL_CALC_FOUND_ROWS 중 어떤 것이 참조되어야하는지 명확하지는 않습니다. 따라서 이러한 사소한 쿼리는 반복 실행기에서 이전과 비교했을 때 반드시 다른 의미를 갖습니다.
마지막으로 SQL_CALC_FOUND_ROWS가 유용한 것처럼 보이는 대부분의 사용 사례는 LIMIT / OFFSET 이외의 다른 메커니즘으로 간단히 해결해야합니다. 예를 들어, 전화 번호부는 레코드 번호가 아닌 문자 (UX 및 색인 사용)로 페이지를 매겨 야합니다. 토론은 우편 번호로 페이지를 매기는 것이 아니라 날짜별로 (인덱스 사용을 허용하는) 순서대로 점점 더 많이 스크롤됩니다. 등등.
SQL_CALC_FOUND_ROWS
20 초가 걸렸습니다. 별도의COUNT(*)
쿼리를 사용하는 데 5 초 미만이 걸렸습니다 (카운트 + 결과 쿼리 모두).