2017-10-29 1 views
3

SQLite 3을 사용하고 있습니다. 테이블이 forums, 150 행, 테이블이 posts, ~ 440 만입니다. 각 게시물은 포럼에 속합니다.1을 선택하려면 40ms가 걸리고 150을 선택하려면 500 초가 걸리는 이유는 무엇입니까?

각 포럼에서 최신 게시물의 타임 스탬프를 선택하고 싶습니다. 최신 게시물 하나를 묻는다면 SELECT MAX(timestamp) FROM posts WHERE forum_id = 5으로 평균 40ms가 걸립니다.

나는

SELECT forums.name, max(posts.timestamp) 
FROM posts 
JOIN forums ON posts.forum_id = forums.id 
GROUP BY forums.name 

의미가 있습니다 모든 포럼 및 최신 게시물의 목록을 요청하지만, 500S한다 - 단지 150 배 많은 선택, 더 오래 12,000x보다. 응용 프로그램에 루프를 작성하여 150 개의 개별 선택 쿼리를 실행하면 훨씬 빠릅니다.

나는 posts.timestamp에 색인을 만들고 posts.timestamp, posts.forum_id의 색인을 만들었습니다. 도움이되지 않았다.

내가 뭘 잘못하고 있니?

+0

색인은 어떻게 생겼습니까? – negacao

+5

'forum_id'별로 직접 그룹화하지 않는 이유는 무엇입니까? – Sirko

+0

내 인덱스는'CREATE INDEX forums_name ON posts (forum_id ASC)'및'CREATE INDEX time_and_forum ON posts (타임 스탬프 DESC, forum_id ASC)'입니다. – GreenTriangle

답변

2

나는 다음과 같은 GROUP BY posts.forum_id 쿼리를 포함하는 인덱스

create index ix_posts_forumid_timestamp on posts(forum_id, timestamp) 

를 만들 것

select forum_id, max(timestamp) 
from posts 
group by forum_id 

쿼리가 몇 초 내에 처리되는 경우, , 당신은 forums와 결합 테스트 할 수 있습니다 쿼리뿐만 아니라 다른 인덱스에 포함 할 수 있지만, 당신은 모든 포럼을 필요로하기 때문에, 나는 그것이 첫 번째 인덱스만큼 중요하지 않습니다 생각

select f.name, t.maxTime 
from forums f 
(
    select forum_id, max(timestamp) maxTime 
    from posts 
    group by forum_id 
) t on t.forum_id = f.forum_id 

같은. 그리고 결국에는 색인을 사용하면 다음 쿼리도 충분히 빠릅니다.

select f.name, max(p.timestamp) maxTime 
from posts p 
join forums f on f.forum_id = p.forum_id 
group by p.forum_id 
1

해당 열에는 색인이 없기 때문에 forums.name에 그룹화하는 것이 문제 일 수 있습니다. posts.forum_id을 그룹화 해보세요. 당신이 출력 포럼 이름을 얻으려고 노력하는 경우

, 당신은 시도 할 수 다음

SELECT forums.name, t.latestTimeStamp 
From 
(select posts.forum_id, max(posts.timestamp) as latestTimeStamp 
FROM posts 
GROUP BY forums.forum_id) as t 
JOIN forums ON t.forum_id = forums.id 
+0

7 분이 지났으며이 쿼리가 여전히 실행 중이므로 잘못된 것이 확실하지 않습니다. – GreenTriangle

+0

하위 선택만으로도 그 기간이 길게 실행됩니까? – Sirko

+0

하위 선택을 지금까지 약 3 분 실행하고 여전히 가고있다. – GreenTriangle

관련 문제