2009-07-05 2 views
0

사람들이 테이블의 행을 볼 수있는 웹 사이트가 있습니다 (각 행은 그림 임). 100,000 개가 넘는 행이 있습니다. 행의 여러 하위 집합을 볼 수 있으며 다른 정렬 순서로 볼 수 있습니다. 행 중 하나를보고있는 동안 "다음"또는 "이전"단추를 클릭하여 목록의 다음/이전 행으로 이동할 수 있습니다.MySQL 결과 세트의 다음 버튼에 대한 효율적인 알고리즘

웹 사이트의 "다음"및 "이전"기능을 어떻게 구현합니까?

특히, 100,000 개가 넘는 행의 목록을 반환하는 임의의 쿼리가 있고 누군가 현재보고있는 행에 대한 정보를 알고있는 경우 어떻게 NEXT 행을 효율적으로 결정합니까?

여기 웹 사이트가 젊었을 때 생각해 낸 해결책의 의사 코드가 있습니다. 단지 1000 개의 행이 있었지만 잘 작동했지만 지금은 너무 많은 메모리를 먹어 가고 있다고 생각합니다. . 이 문제에 대해 생각하는 동안

int nextRowId(string query, int currentRowId) 
{ 
    array allRowIds = mysql_query(query); // Takes up a lot of memory! 
    int currentIndex = (index of currentRowId in allRowIds); // Takes time! 
    return allRowIds[currentIndex+1]; 
} 

, 웹 사이트 (예를 들어, 결과 집합의 현재 행의 위치를) 단지의 ID보다 현재 행에 대한 자세한 정보를 저장할 수 있다는 것을 기억하고이 정보를 다음 행 ID 식별에 도움이되는 힌트로 사용할 수 있습니다.

편집 : 이전에는 언급하지 않아서 불편을 끼쳐 드려 죄송합니다. 그러나 정적 웹 사이트가 아닙니다. 행을 목록에 자주 추가 할 수 있으며 행을 목록에서 다시 정렬 할 수 있습니다. (매우 희소하게, 행은 목록에서 제거 될 수 있습니다.) 나는 그런 종류의 것에 대해 걱정해야한다고 생각하지만 어쩌면 당신은 나를 그렇지 않으면 설득 할 수 있습니다.

답변

0

을 사용하십시오. mysql 제한 절을 사용하십시오. as select * from tableA limit 0,100;

0과 100을 자연스럽게 매개 변수화하거나 양식 또는 원하는 곳에 저장할 수 있으므로 사용자가 다음을 누를 때 사용할 오프셋을 알 수 있습니다. 그러면 렌더링 할 모든 다음/이전 페이지에 대한 쿼리를 다시 실행해야합니다.

+0

답변 해 주셔서 감사합니다!기계의 대답에 대한 내 의견을 참조하십시오. 왜냐하면 두 가지 모두 귀하의 답변에도 적용되기 때문입니다. –

4

쿼리에 LIMIT 절을 적용 해 보았습니까? MySQL의 설명서

한계 절에서

은 SELECT 문에 의해 반환 된 행의 수를 제한 할 수 있습니다. LIMIT는 하나 또는 두 개의 숫자 인수를 취하는데, 둘 다 음수가 아닌 정수 상수 여야합니다 (준비된 명령문을 사용할 때 제외). 두 인수와

는 첫 번째 인수는 반환 첫 번째 행의 오프셋을 지정하고, 두 번째 행의 최대 수는 하나의 인자 값을 지정하여

SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15 

를 반환하도록 지정 오프셋

SELECT * FROM tbl LIMIT 5;  # Retrieve first 5 rows 
+0

웹 사이트의 목록을 페이징 할 때 제한은 실제로 이동하는 유일한 방법입니다. –

+0

그는 '효율적인'- 오프셋/제한은 원하는 행보다 먼저 모든 행을 반복하고 필터링하는 것을 의미합니다. –

+0

네,하지만 지금 그가 무엇을 사용하고 있는지 고려해 보면, DBMS가 필터링 작업을 수행하고 필요한 양의 데이터 만 클라이언트로 보내도록하는 것은 아주 큰 단계입니다. 어쨌든, 머리 꼭대기에서 더 좋은 제안을 얻었습니다. – PatrikAkerstrand

관련 문제