source

각 그룹에 대한 카운트를 가져오지만 각 그룹의 결과 행 N개 이후 카운트를 중지합니다.

manycodes 2022. 12. 5. 21:27
반응형

각 그룹에 대한 카운트를 가져오지만 각 그룹의 결과 행 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_types는 내부 쿼리에 포함되며 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

DB Fielen의 실행 예를 참조하십시오.

가로 방향 쿼리는 앞에 배치된 테이블 식에서 사용 가능한 값에 따라 한 번 실행됩니다.이 경우 테이블 표현식x에 대해 모든 다른 값을 생성하다log_type(퍼포먼스에 지수를 사용).그런 다음 가로 방향 쿼리가 각 값마다 한 번씩 실행됩니다.x , 를합니다.LIMIT3번으로 하다으로 쿼리는 몇 합니다.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

반응형