2014-01-10 1 views
1

현재 개인 PHP 웹 사이트를 개발 중입니다. 우리는 점수와 날짜별로 다른 항목이 표시되는 페이지를 가지고 있습니다. 모든 사용자는 각 항목에 "투표"할 수 있습니다 (+1, -1). 이 페이지는 한 번에 10 개의 항목을 표시하며 다음 항목을 가져 오는 "추가로드"버튼이 있습니다. 매번 "더 많은로드"기능이 트리거 될 때마다 쿼리를 실행하여 다음 10 개 항목을 가져옵니다. 이를 위해 나는 이러한 종류의 쿼리를 실행 한 같은 항목이 "로드 (두 번째 시간을 조회 할 수 있음을 사용자가 증가/항목의 점수를 감소 할 수 있다는 사실, 그것은 가능성을 감안할 때"추가로드"기능 구현

SELECT * FROM items ORDER BY score DESC, date_added DESC LIMIT '.$count.', 10

more "트리거).

어떻게 해결할 수 있습니까? 테이블의 스냅 샷을 생각하고 오래된 데이터 일지라도 저장 한 데이터를 가져 오는 것이 좋습니다.

+0

자세히로드를 클릭하면 다음 10 개 항목을로드해야 중복 항목이 없어야합니다. –

답변

3

당신은 (임시 테이블에) 이미 보내 져야 할 엔트리의 목록을 저장하고 NOT IN ID가

이입니다 (already_sent 이드 USER_ID = $ UID를 선택) WHERE

를 사용할 수 있습니다 매우 빠르고 비효율적 인 솔루션으로, 많은 요청에 대해 확장 성이 뛰어나지 만, 사용자의 요구에 맞는 좋은 솔루션을 알지 못합니다. 또 다른 해결책은 전체 결과를 미리 가져 와서 특정 요청 집합에 대해 안전하지만이 솔루션은 페이지의 최대 결과를 제한하는 것입니다 (예 : 9gag와 같이)

+1

나는'WHERE col NOT IN'과 함께 갈 것입니다. 아마도 하위 선택을하지 않고 수동으로 제외 할 ID를 가져 와서 전달하면 성능을 향상시킬 수 있습니다. – thpl

+1

그러나 웹 서버와 MySQL 사이에 여러 요청을 통해 목록이 커지면 많은 대역폭이 필요합니다. 나는 서버의 MEMORY 엔진 테이블이이 경우 훨씬 더 성능이 좋을 것이라고 생각한다. 그러나 나는 또한이 전체 솔루션이 나를 위해 매우 못생긴 것만 말할 수 있습니다.) – th3falc0n

+0

9gag는 한 페이지에서 최대 값에 도달 할 때 무엇을합니까? – jajex