programing

MySQL에서 여러 열의 MAX() 선택

lastcode 2023. 7. 26. 22:07
반응형

MySQL에서 여러 열의 MAX() 선택

저는 현재 (PHP와 MySQL을 사용하여) 방대한 쿼리를 가지고 있으며 18-25초의 방대한 부하를 줄이기 위해 최적화하는 방법을 잘 모르겠습니다.이전 답변을 살펴보니 모두 비슷한 양의 코드를 작성하여 스크립트 실행 시간이 비슷하다는 것을 알 수 있었습니다. 따라서 이미 제시된 것과 달리 다른 아이디어를 가진 사람이 있는지 알고 싶습니다.

TLDR: 각 분석 ID에 대한 최대 열을 선택해야 하며 이는 엄청난 부하를 유발하므로 어떻게든 줄여야 합니다.

$qry = "SELECT DISTINCT ip,country_code,country,
(SELECT MAX(region)  FROM analytics RegOne WHERE bid='$id' AND RegOne.ip= IPOne.ip) AS region,
(SELECT MAX(city)    FROM analytics CitOne WHERE bid='$id' AND CitOne.ip= IPOne.ip) AS city,
(SELECT MAX(os)      FROM analytics OSOne  WHERE bid='$id' AND OSOne.ip= IPOne.ip) AS os,
(SELECT MIN(browser) FROM analytics BroOne WHERE bid='$id' AND BroOne.ip= IPOne.ip) AS browser,
(SELECT MIN(resolution) FROM analytics ResOne  WHERE bid='$id' AND ResOne.ip= IPOne.ip) AS resolution,
(SELECT MAX(timestamp)  FROM analytics DateOne WHERE bid='$id' AND DateOne.ip= IPOne.ip) AS LatestDate
FROM analytics AS IPOne
WHERE bid='$id'
ORDER BY LatestDate DESC
LIMIT 15 OFFSET $offset";

이는 대용량 테이블에서 데이터를 가져오는 것이므로 0초가 걸리지 않을 것으로 예상되지만 ~21초보다는 시간을 줄이는 것이 좋습니다.

그거 좋지

SELECT ip, country_code, country,
     MAX(region) as region,
     MAX...
     MAX(timestamp) as LatestDate
FROM analytics
WHERE bid = '$id'
GROUP BY ip, country_code, country
ORDER BY LatestDate DESC
LIMIT 15 OFFSET $offset";

다음으로 시작하는 인덱스가 있어야 합니다.bid이 방법이 더 나을 수 있습니다.

INDEX(bid, ip, country_code, country)

복합 키를 설정해야 합니다.(bid, ip)KEY를 설정한 경우(bid)그런 다음 추가(또는 대체)(bid, ip)

언급URL : https://stackoverflow.com/questions/31633743/select-max-of-multiple-columns-in-mysql

반응형