친구가 물었습니다. MySQL 페이징이 항상 문제였던 것 같습니다. 최적화 방법이 있나요? 온라인에서 권장되는 몇 가지 페이징 방법을 보았는데 실행 가능하지 않은 것 같습니다. 이에 대해 의견을 주실 수 있나요?
방법 1: 데이터베이스에서 제공하는 SQL 문을 직접 사용
---문 스타일: MySQL에서는 다음 방법을 사용할 수 있습니다: SELECT * FROM 테이블 이름 LIMIT M,N.
---적용 가능한 시나리오: 데이터 양이 적은 상황(수백/수천의 튜플 수준)에 적합합니다.
---이유/단점: 전체 테이블 스캔은 매우 느리고 일부 데이터베이스 결과 세트는 불안정하게 반환됩니다(예를 들어 한 번은 1,2,3을 반환하고 다른 번은 2,1,3을 반환함). Limit은 결과 집합의 M 위치에서 N개의 출력을 제한하고 나머지는 삭제합니다.
방법 2: 기본 키 또는 고유 인덱스를 생성하고 인덱스 사용(페이지당 10개 항목 가정)
---문 스타일: MySQL에서는 다음 메서드를 사용할 수 있습니다.
SELECT * FROM 테이블 이름 WHERE id_pk > (pageNum*10) LIMIT M.
---적용 가능한 시나리오: 대량의 데이터(수만 개의 튜플)가 있는 상황에 적합합니다.
---이유: 인덱스 스캔 속도가 매우 빠릅니다. 친구는 데이터 쿼리가 pk_id에 따라 정렬되지 않기 때문에 데이터가 누락되는 경우가 있으므로 유일한 옵션은 방법 3이라고 제안했습니다.
방법 3: 인덱스를 기준으로 재정렬
---문 스타일: MySQL에서는 다음 방법을 사용할 수 있습니다: SELECT * FROM table name WHERE id_pk > (pageNum*10) ORDER BY id_pk ASC LIMIT M.
---시나리오에 적응: 데이터 양이 많은 상황(수만 개의 튜플)에 적합합니다. ORDER BY 뒤의 열 개체가 기본 키이거나 고유하므로 ORDER BY 작업을 제거하는 것이 가장 좋습니다. 인덱스를 사용하지만 결과 집합이 안정적입니다(안정성의 의미는 방법 1 참조).
---이유: 인덱스 스캔은 매우 빠릅니다. 그러나 MySQL의 정렬 작업에는 ASC만 있고 DESC는 없습니다(DESC는 가짜입니다. 실제 DESC는 앞으로 수행될 예정입니다. 기대하세요).
방법 4: 인덱스 기반 준비 사용(첫 번째 물음표는 페이지 번호를 나타내고 두 번째?는 페이지당 튜플 수를 나타냄)
---문 스타일: MySQL에서는 다음 메소드를 사용할 수 있습니다:
PREPARE stmt_name FROM SELECT * FROM 테이블 이름 WHERE id_pk > (?* ?) ORDER BY id_pk
ASC 제한 M.
---시나리오에 적응: 대용량 데이터.
---이유: 인덱스 검색은 일반 쿼리 문보다 빠릅니다.
방법 5: MySQL을 사용하여 ORDER 작업을 지원하면 인덱스를 사용하여 일부 튜플을 빠르게 찾고 전체 테이블 스캔을 피할 수 있습니다
---예: 1000~1019행의 튜플을 읽습니다(pk는 기본 키/고유 키입니다).
---SELECT * FROM your_table WHERE pk>=1000 ORDER BY pk ASC LIMIT 0,20.
방법 6: "하위 쿼리/조인 + 인덱스"를 사용하여 튜플을 빠르게 찾은 다음 튜플을 읽는 원리는 방법 5와 동일합니다
---예(id는 기본 키/고유 키, 파란색 글꼴의 변수):
하위 쿼리 사용 예:
SELECT * FROM your_table WHERE id <= (SELECT id FROM your_table ORDER BY id desc LIMIT ($page-1)*$pagesize ORDER BY id desc LIMIT $pagesize
활용 연결 예시 :
SELECT * FROM your_table AS t1 JOIN (SELECT id FROM your_table ORDER BY id desc LIMIT ($page-1)*$pagesize AS t2 WHERE t1.id <= t2.id ORDER BY t1.id desc LIMIT $pagesize;
방법 7: 저장 프로시저 클래스(위 방법을 5/6 결합하는 것이 가장 좋음)
---문 스타일:
은 더 이상 제공되지 않습니다. ---시나리오에 적응: 대용량 데이터 작가가 추천하는 방법
---이유: 서버에서 작업을 캡슐화하는 것이 상대적으로 빠릅니다.
방법 8: 부정 방법
---인터넷의 누군가가 SQL_CALC_FOUND_ROWS 사용에 대해 썼습니다. 말도 안 돼요, 흉내 내지 마세요.
기본적으로 모든 데이터베이스로 확장이 가능하며 원리는 동일합니다. 그러나 방법 5는 다른 데이터베이스로 확장되지 않을 수 있습니다. 승격의 전제는 다른 데이터베이스가 ORDER BY 작업을 지원하고 인덱스를 사용하여 정렬을 직접 완료할 수 있다는 것입니다.
위 내용은 MySQL 페이징 기술 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!