수백만 개의 레코드가있는 SQLite의 효율적인 페이징


102

목록보기에 SQLite 결과를 표시해야합니다. 물론 결과를 페이징해야합니다.

첫 번째 옵션은 LIMIT 절을 사용하는 것입니다. 예를 들면 :

SELECT * FROM Table LIMIT 100, 5000

5001에서 5100까지의 레코드를 반환합니다. 문제는 SQLite가 내부적으로 처음 5000 개의 레코드를 "읽고"너무 효율적이지 않다는 것입니다.

레코드가 많을 때 페이징을위한 가장 좋은 방법은 무엇입니까?

답변:


118

항상 ORDER BY절 을 사용해야합니다 . 그렇지 않으면 순서가 임의적입니다.

효율적인 페이징을 수행하려면 순서가 지정된 필드의 첫 번째 / 마지막 표시된 값을 저장하고 다음 페이지를 표시 할 때 바로 뒤에 계속합니다.

SELECT *
FROM MyTable
WHERE SomeColumn > LastValue
ORDER BY SomeColumn
LIMIT 100;

(이것은 SQLite 위키에 더 자세히 설명되어 있습니다 .)

여러 정렬 열 (및 SQLite 3.15 이상)이있는 경우이를 위해 행 값 비교 를 사용할 수 있습니다 .

SELECT *
FROM MyTable
WHERE (SomeColumn, OtherColumn) > (LastSome, LastOther)
ORDER BY SomeColumn, OtherColumn
LIMIT 100;

8
SomeColumn에 101 개의 동일한 값이있는 경우는 어떻습니까? :이 더 나은 것 같다 blog.ssokolow.com/archives/2009/12/23/...
제이 섹 Ławrynowicz

6
@ JacekŁawrynowicz 정렬 열이 고유하지 않은 경우 더 많은 열을 기준으로 정렬해야합니다. 어쨌든 대체 답변이 있으면 답변을 만드십시오.
CL.

@CL 조인 쿼리를 사용하여 여러 AND 조건으로 수행하는 방법
YLS

@YLS 요즘에는 행 값을 사용할 수 있습니다.
CL.

2
이 접근 방식을 사용하는 문제는 이 의견에
mr5
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.