처음 : 사용하지 마십시오 SELECT *
. 대신 원하는 열의 이름을 지정하십시오.
두 번째 : user_device.userid
에서 일치하는 항목을 찾고 있습니다. 따라서 user_device
에 userid
열로 시작하는 색인이 필요합니다. 같은 테이블에 deviceid
값을 사용합니다. 따라서이 색인을 만드십시오. covering index이라고합니다.
ALTER TABLE user_device ADD INDEX x_user_device (userid, deviceid);
셋째 : 그런 다음 id
에 의해 주문, deviceid
에 의해 events
의 행을 찾고 있습니다. 따라서이 두 열에 다른 covering index이 필요합니다.
ALTER TABLE events ADD INDEX x_device_id (deviceid, id);
넷째 : 당신은 WHERE 절에 LEFT 조인 된 테이블에서 열을 언급. 이것은 LEFT JOIN을 일반적인 내부 JOIN으로 변환합니다. 그래서 JOIN을 사용하십시오.
제 5 : SELECT * ... ORDER BY ... LIMIT
은 악명 높은 성능의 반 패턴입니다. 왜? 기록을 완전히 엉망으로 만들어 버리고 몇 가지를 제외한 모든 것을 버리십시오. 대신이 방법을 사용해보십시오. 먼저 서브 쿼리를 사용하여 관련 events.id
값을 가져옵니다.
SELECT events.id
FROM events
JOIN user_device ON user_device.deviceid=events.deviceid
WHERE user_device.userid=101
ORDER BY events.id DESC
LIMIT 5
하위 쿼리를 테스트하십시오. 5 개의 관련 이벤트 ID 값을 제공해야하며 실제로이를 매우 빠르게 수행해야합니다.이 하위 쿼리를 사용하여 두 테이블에서 필요한 세부 정보를 찾으십시오.
SELECT events.*, user_device.* /* not optimal. list only the columns you need */
FROM (
SELECT events.id
FROM events
JOIN user_device ON user_device.deviceid=events.deviceid
WHERE user_device.userid=101
ORDER BY events.id DESC
LIMIT 5
) sel
JOIN events ON sel.id = events.id
JOIN user_device ON events.deviceid = user_device.deviceid
이것을 지연 조인 쿼리 패턴이라고합니다. id
값의 모든 더미에서 모든 순서를 수행 한 다음 몇 개의 레코드 만 추출합니다.
이렇게하면 데이터베이스가 커짐에 따라 성능을 계속 확인할 수 있습니다.
특정 레코드를 얻었 으면 수동으로 작성하고 쿼리에서'* '를 제거하십시오. – Bhargav
쿼리 성능에 관한 섹션을 자세히 읽으십시오. http://meta.stackoverflow.com/a/271056/ 질문을 작성하여 세부 정보를 제공해주십시오. –