2008-08-27 3 views

답변

18

대부분의 경우 결과를 먼저 분류해야하기 때문에. 예를 들어 Google에서 검색 할 때 you can view only up to 100 pages of results입니다. 그들은 주어진 키워드 (또는 키워드의 조합)에 대해 1000 개의 웹 사이트를 넘는 페이지 순위별로 정렬하는 것을 귀찮게하지 않습니다.

페이지 매김이 빠릅니다. 정렬이 느립니다.

2

이것은 매우 모호한 질문입니다. 문제의 더 나은 아이디어를 얻으려면 구체적인 예가 필요합니다.

+2

제목을 보면 질문이 의미가 있습니다. 질문 자체를 읽을 때 의미가 없어집니다. –

3

Lubos에 .. 문제가 (와이어 떨어져 엄청난 양의 데이터 소요) 당신은 페이징는 사실이 아니라 실제로 페이지에 무슨 일이 일어나고 있는지 알아낼 필요가,

권리

페이지로 이동해야한다는 사실은 많은 데이터가 있음을 의미합니다. 많은 데이터가 정렬하는 데 오랜 시간이 걸립니다.

1

나는 당신이 pagination of the printed page을 의미한다고 생각했는데, 그것이 내 이빨을 자른 곳입니다. 나는 페이지의 모든 내용을 모으는 것에 대해 큰 독백을하기 시작했다. 위치 지정 (엄청난 수의 규칙, constrait 엔진은 상당히 도움이된다)과 정당화 ... 그러나 분명히 당신은 웹 페이지에서 정보를 구성하는 과정에 대해 이야기하고 있었다. .

그 때문에 데이터베이스 히트를 추측 할 수 있습니다. 디스크 액세스가 느립니다. 일단 기억에 남으면, 정렬은 저렴합니다.

0

랜덤 쿼리를 정렬하는 데는 다소 시간이 걸리지 만 정기적 인 페이지 매김 쿼리에 문제가있는 경우 데이터베이스 설정에 문제가 있거나 (잘못 인덱싱 됨/전혀 없음, 메모리가 너무 적음) 등등. DB 관리자가 아닙니다) 또는 페이지 매김을 심각하게 잘못하고 있습니다.

끔찍한 오류 : 예 select * from hugetable where somecondition;을 array.length로 페이지 수를 얻는 배열로 가져 와서 관련 인덱스를 선택하고 배열을 dicard 한 다음 각 페이지에 대해 이것을 반복합니다 ... 그게 내가 잘못 말하는 것입니다.

더 나은 두 개의 쿼리 : 하나는 카운트를 얻고 다른 하나는 limitoffset을 사용하는 결과입니다. (일부 독점적 인 비표준 SQL 서버는 단 하나의 쿼리 옵션을 가질 수도 있습니다.)

실제로 작은 테이블에서는 나쁜 해결책이 실제로 제대로 작동 할 수 있습니다. 사실 아주 작은 테이블에서는 더 빠르다고 생각하지 않습니다. 두 개의 쿼리를 만드는 오버 헤드가 하나의 쿼리에서 모든 행을 얻는 것보다 큽니다. 이므로 ...)하지만 데이터베이스가 커지면 문제가 분명 해집니다.

+0

LIMIT와 큰 오프셋, ORDER BY 또는 GROUP BY의 조합은 여전히 ​​리소스 집약적 일 수 있습니다. 따라서 Google은 전체 계산 (1000 개가 넘는 결과 및 '예상')을 얻지 못하고 페이지 매김을하지 않습니다 처음 1000 개의 결과를 넘어서. – thomasrutter

2

이 질문은 꽤 잘 덮여 것 같다,하지만 많은 사람들이 밖으로 잡는 내가 무엇인가 조금 MySQL의 특정을 추가 할 것입니다 : SQL_CALC_FOUND_ROWS를 사용

피를. 데이터 세트가 사소한 것이 아니라면, 매치 카운팅과 두 개의 별도 쿼리에서 x 일치 항목을 검색하는 것이 훨씬 더 빠를 것입니다. (이라면 간과 할 수 없습니다.)

+2

저녁 식사 후 흥미 진진한 팁, 10 분 테스트 후 10 분 tweak, et voila, 내 데이터베이스로드가 가장 무거운 사이트에서 절반이됩니다! 감사! – jTresidder

+0

좋은 팁입니다. 다른 쿼리에서 카운트를 수행하면 행 데이터를 가져 오지 않고 계산할 수 있으며 인덱스 만 사용할 수 있습니다. 그러나 MyIsam과 마찬가지로 InnoDb에서도 작동합니까? 나는 그것이 다르지만 잘못 될 수 있다는 재미있는 느낌을 가지고 있습니다. – thomasrutter