P粉7864325792023-08-25 11:56:11
UPD: 2017-03-31, 버전 5.7.5 MySQL은 기본적으로 ONLY_FULL_GROUP_BY 스위치를 활성화합니다(따라서 비결정적 GROUP BY 쿼리는 비활성화됩니다). 또한 GROUP BY 구현을 업데이트했으며 스위치가 비활성화된 경우에도 솔루션이 예상대로 작동하지 않을 수 있습니다. 확인해 볼 필요가 있습니다.
Bill Karwin의 위 솔루션은 그룹 내의 항목 수가 다소 적을 때 잘 작동하지만 솔루션에 약 n*n/2 + n/2
of only IS NULL
비교가 필요하기 때문에 그룹이 다소 클 경우 쿼리 성능이 저하됩니다.
저는 18684446
rows with 1182
groups. The table contains testresults for functional tests and has the (test_id, request_id)
as the primary key. Thus, test_id
is a group and I was searching for the last request_id
for each test_id
.
Bill의 솔루션은 내 Dell e4310에서 이미 몇 시간 동안 실행되었으며 적용 범위 인덱스에서 작동하더라도 언제 완료될지 알 수 없습니다(따라서 EXPLAIN의 using index
).
동일한 아이디어를 기반으로 한 몇 가지 다른 솔루션이 있습니다.
(group_id, item_value)
pair is the last value within each group_id
, that is the first for each group_id
입니다.MySQL이 인덱스를 사용하는 3가지 방법은 일부 세부 사항을 이해하는 데 도움이 되는 훌륭한 기사입니다.
해결책 1
이 작업은 1,800만 개 이상의 행에서 약 0.8초가 소요되는 믿을 수 없을 정도로 빠릅니다.으아악
순서를 ASC로 변경하려면 ID만 반환하는 하위 쿼리에 넣고 나머지 열을 조인하는 하위 쿼리로 사용하세요.으아악
내 데이터에는 약 1.2초 정도 소요됩니다.
해결책 2
내 시계에 약 19초가 걸린 또 다른 솔루션은 다음과 같습니다.으아아아
또한 테스트를 내림차순으로 반환합니다. 전체 인덱스 스캔을 수행하기 때문에 속도는 훨씬 느리지만 각 그룹별로 최대 N개의 행을 출력하는 방법에 대한 아이디어를 제공합니다.
이 쿼리의 단점은 쿼리 캐시가 결과를 캐시할 수 없다는 것입니다.
P粉8484421852023-08-25 09:17:24
MySQL 8.0은 이제 거의 모든 널리 사용되는 SQL 구현과 같은 창 기능을 지원합니다. 이 표준 구문을 사용하면 그룹당 최대 n개의 쿼리를 작성할 수 있습니다.
으아아아이 방법과 그룹화된 최대 행 수를 찾는 다른 방법은 MySQL 매뉴얼에 설명되어 있습니다.
다음은 제가 2009년에 이 질문에 쓴 원래 답변입니다.
저는 다음과 같이 솔루션을 작성했습니다:
으아아아성능에 관해서는 데이터의 성격에 따라 하나의 솔루션이 더 나을 수도 있습니다. 따라서 두 쿼리를 모두 테스트하고 데이터베이스에 따라 성능이 더 나은 쿼리를 사용해야 합니다.
예를 들어, StackOverflow August 데이터 덤프가 있습니다. 이를 벤치마킹에 사용하겠습니다. Posts
테이블에는 1,114,357개의 행이 있으며 이는 내 Macbook Pro 2.40GHz에서 실행됩니다. .
지정된 사용자 ID(mine)에 대한 최신 게시물을 찾는 쿼리를 작성하겠습니다.
를 사용하여 shown 기술을 사용하는 방법은 다음과 같습니다.GROUP BY
으아아아
심지어
분석에도 16초 이상 소요됩니다.EXPLAIN
으아아아
내 기술과 :LEFT JOIN
을 사용하여 동일한 쿼리 결과를 생성합니다.
으아아아
으아아아
EXPLAIN
으아아아
Posts