문제

좋은 날, 나는 많은 문제로 어려움을 겪고있는 질문이 있습니다. 누군가 이미 이것에 대한 영리한 해결책을 찾았기를 바랍니다 (MySQL을 사용합니다).

나는 다음과 같은 테이블이 있습니다.

Table `log`
----------
id
inserted
message
user_id

내 목표는 사용자를 위해 마지막 삽입 된 레코드를 선택하고이를 빠르게 만드는 것입니다. 로그 테이블은 거대 (약 900K 레코드)이므로 첫 번째 접근 방식은 다음과 같습니다.

SELECT * FROM `log` 
LEFT JOIN `users` ON `users`.`id` = `log`.`user_id`
WHERE `id` IN 
(
 SELECT MAX(`id`) FROM `log` GROUP BY `user_id`
)

그러나 모든 행에 대한 하위 쿼리를 계산하는 것 같습니다 (설명 종속 쿼리 설명). 이 쿼리를 두 가지로 나누면 다음과 같습니다.

SELECT MAX(`id`) FROM `log` GROUP BY `user_id`

그리고

SELECT * FROM `log` 
LEFT JOIN `users` ON `users`.`id` = `log`.`user_id`
WHERE `id` IN (....ids from first query...)

실행하는 것이 허용됩니다. 이것을 하나의 쿼리로 달성 할 수 있습니까?

도움이 되었습니까?

해결책

그룹을 사용하여 그룹을 사용하여 그룹 별 최대 값을 가져 오는 것 외에도 테이블에서 특정 행에 대한 추가 필드를 가져 오기 위해 상관되지 않은 하위 퀘스트를 만들고 싶을 것입니다.

SELECT
  la.user_id,la.message
FROM
  `log` as la
INNER JOIN
  (
    SELECT
      user_id, MAX(id) AS maxid
    FROM
      `log`
    GROUP BY
      user_id
    ) as lb
ON
  la.id = lb.maxid

색인이있는 경우 가장 효과적/빠릅니다.

KEY `foo` (`user_id`,`id`)

그러나 그 열쇠가 없어도 성능은 강하됩니다.

다른 팁

어때

SELECT user_id, max(id) FROM `log` GROUP BY user_id

?

로그 테이블의 모든 사용자에 대한 최대 ID가 모두 하나의 쿼리로 제공됩니다!

항상 특정 사용자에 대한 로그를 찾고 있다면 user_id로 로그 파일을 분할하면 속도가 빠릅니다. 테이블이 사용자가 분할하고 ID로 인덱싱 된 경우 쿼리가 매우 빠르게 실행됩니다.

편집 : Dominik의 쿼리를 참조하십시오

또한 user_id에 대한 색인이 있는지 확인합니다.

편집 : 일반화

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top