각 그룹에 대한 카운트를 가져오지만 각 그룹의 결과 행 N개 이후 카운트를 중지합니다.
테이블에서 (불필요하게) 거의 90,000 행까지 카운트되는 쿼리를 최적화하려고 합니다.이것은 시간이 너무 오래 걸립니다.
이 테이블에는 웹 앱의 다른 부분에서 발생하는 이벤트에 대한 로그 항목이 포함되어 있습니다. 각 로그 유형에 대해 읽지 않은 로그 항목이 몇 개 있는지 알고 싶습니다. 로그 유형의 행 수가 1000 이하일 때는 읽지 않은 로그 항목 수를 알고 싶습니다. 그러나 개수가 1001 이상인 경우에는 최대 1001개 행까지 계산하십시오.
그 이후에는 더 이상 카운트할 필요가 없습니다.그 로그 타입에 대해서 「1000 이상」을 출력합니다.
예를 들어 다음과 같은 표가 있다고 합시다.my_logs
데이터 포함:
id log_type log_text is_read
1 'Type 1' 'Text 1' 1
2 'Type 1' 'Text 2' 1
3 'Type 1' 'Text 3' 0
4 'Type 1' 'Text 4' 0
5 'Type 1' 'Text 5' 0
6 'Type 1' 'Text 6' 0
7 'Type 2' 'Text 7' 0
8 'Type 2' 'Text 8' 0
이 예에서 현재 쿼리는 다음과 같습니다.
SELECT log_type, COUNT(*) AS unread FROM my_logs WHERE is_read = 0 GROUP BY log_type;
이 쿼리는 모든 행을 카운트하고 각 로그 유형에 대한 올바른 행 수를 제공합니다.문제는 테이블에 90,000 행이 포함되어 있는 경우, 이것은 고가의 쿼리이며, 사용자가 1,000 행과 20,000 행의 차이를 신경 쓰지 않기 때문에 각 유형의 1,000 행 이상을 셀 필요가 전혀 없다는 것입니다.
이것이 솔루션에 가장 근접한 것입니다(적합하도록 제한 조정).my_logs
예를 들어 사용법을 시연합니다).
SELECT log_type, COUNT(*) AS unread
FROM (
SELECT log_type
FROM my_logs ml1
WHERE is_read = 0
LIMIT 3 /* To display "more than 2" in webapp */
) AS ml2
GROUP BY logtype_txt;
하지만 이 쿼리는 모두 함께 풀링됩니다.log_type
s는 내부 쿼리에 포함되며 1001 행으로 제한됩니다.이것은 내가 원하는 것이 아닙니다.각 행을 분할해야 합니다.log_type
최대 1001 행을 카운트합니다.이 예에서 필요한 출력은 다음과 같습니다.
log_type unread
'Type 1' 3
'Type 2' 2
이 질문과 이 질문에서는 n개의 행이 발견되었을 때 카운트를 정지하는 방법에 대해 설명하지만 필요한 그룹화는 고려하지 않습니다.
해결책을 아는 사람이 있나요?
이 답변은 MariaDB 또는 MySQL에서는 작동하지 않습니다.
찾고 있는 답은 "측면 테이블 식"에 기초하고 있습니다.이는 Oracle, DB2, Postgre에 구현되어 있습니다.SQL 및 SQL Server.
Postgre 표에서 읽은 행의 관점에서 최적의 쿼리를 다음에 나타냅니다.SQL:
select x.log_type, count(y.z)
from (
select distinct log_type as log_type
from my_log
) x
left join lateral (
select 1 as z
from my_log b
where b.log_type = x.log_type and is_read = 0
limit 2 + 1
) y on true
group by x.log_type
가로 방향 쿼리는 앞에 배치된 테이블 식에서 사용 가능한 값에 따라 한 번 실행됩니다.이 경우 테이블 표현식x
에 대해 모든 다른 값을 생성하다log_type
(퍼포먼스에 지수를 사용).그런 다음 가로 방향 쿼리가 각 값마다 한 번씩 실행됩니다.x
, 를합니다.LIMIT
3번으로 하다으로 쿼리는 몇 합니다.z
을 사용법
보시다시피 위의 프로세스는 유형별로 최대 3개의 행만 읽습니다.
의 MariaDB-5.5.21의 를 확인해 .LIMIT ROWS EXAMINED
:
https://mariadb.atlassian.net/browse/MDEV-28
그게 바로 당신이 원하는 것이어야 해요.
(MySQL에서는 사용할 수 없는 것 같습니다.)
언급URL : https://stackoverflow.com/questions/62324502/get-count-for-each-group-but-stop-counting-after-n-result-rows-in-each-group
'source' 카테고리의 다른 글
vue .net 코어 애플리케이션의 Vuex (0) | 2022.12.05 |
---|---|
설치된 Python 버전은 무엇입니까? (0) | 2022.12.05 |
Composer 자동 로드 사용 (0) | 2022.12.05 |
객체 속성에 직접 할당된 호출 종료 (0) | 2022.12.05 |
Python에서 같은 줄에 여러 개의 인쇄물 (0) | 2022.12.05 |