2 개의 테이블이 있으며 필요한 쿼리가 매우 느리게 실행됩니다. 예를 들어, 관련 필드가있는 두 개의 샘플 표를 보여줍니다.많은 수의 행에 Android SQLITE 쿼리가 느림
Table MAIN
MAIN.USERID text
MAIN.LOGGED_USERID text
MAIN.other text fields not relevant to query
Index on USERID, LOGGED_USERID
Table LOGS
LOGS.CREATED int
LOGS.USERID text
LOGS.LOGGED_USERID text
LOGS.TYPE int
Index on USERID,LOGGED_USERID,TYPE
LOGS 테이블에서 USER/LOGGED_USER의 최신 날짜를 가져와야합니다. 내가 실행해야 쿼리는 유사합니다
Select m.some fields,
(Select l.CREATED
from LOGS l
where l.USERID=u.USERID and l.LOGGED_USERID=m.LOGGED_USERID and TYPE=1
order by l.CREATED desc limit 1) as LAST_DATE
from MAIN m
WHERE some fields not relevant and an EXIST command from other table
ORDER BY some fields not relevant
쿼리 행 제한된 수의 각 테이블에 150,000 행을 가진 경우, 쿼리가 실제로 종료 것 같다, 또는 적어도 나는 천국 결코를 위해 잘 실행하는 동안
그걸 오래 기다렸어. 성능 저하는 LAST_DATE 쿼리에서 비롯됩니다. 즉각적인 결과 일 것입니다. 아마도 내가 가지고있는 인덱스가 사용되지 않았습니까?
'... 일부 필드는 관련이 없습니다 ...'이 '관련 없음'필드도 색인화되어야합니다. 색인 생성을위한 주요 규칙 :'모든 JOIN과 WHERE 열 색인화 '. –
하위 쿼리없이 확인해야 할 수도 있습니다. 가능하다면 조인으로 바꿉니다 ('u.USERID'가 표시되지만 m.USERID 일 수 있습니다). 이는 모든 행에 대해 실행될 것이기 때문입니다. – AxelH
LAST_DATE 쿼리가 없으면 모든 것이 빠르게 작동합니다. LAST_DATE 쿼리를 사용하면 기본 쿼리 나 ORDER에서 WHERE를 사용하지 않아도 쿼리가 오랜 시간 실행됩니다. 그렇기 때문에 제가 포함하지 않은 것은 바로 – Alin