목록에 콘텐츠를 표시할 때, 목록에 포함되는 콘텐츠의 양은 많지만 사용자가 한 번에 볼 수 있는 인터페이스의 크기가 제한되어 있기 때문에 필연적으로 페이징 문제가 발생합니다. 한 번에 너무 많은 데이터를 가져오면 백엔드에 추가적인 부담이 가해집니다. Mysql 페이징은 우리가 개발 중에 자주 접하게 되는 함수인데, 최근 이 함수를 구현할 때 문제가 발생했기 때문에 이번 글에서는 주로 mysql 페이징 시 과도한 오프셋이 발생하는 SQL 최적화 경험을 소개합니다. 모든 사람의 공부나 업무에 대한 특정 참조 및 학습 가치가 있습니다. 필요한 친구는 편집자를 따라 살펴볼 수 있습니다.
페이징 쿼리를 수행할 때 일반적으로 다음과 같은 문이 사용됩니다.
SELECT * FROM table where condition1 = 0 and condition2 = 0 and condition3 = -1 and condition4 = -1 order by id asc LIMIT 2000 OFFSET 50000
오프셋이 특히 큰 경우 이 문의 실행 효율성이 크게 떨어지며, 오프셋이 증가함에 따라 효율성이 감소합니다.
이유는 다음과 같습니다.
MySQL은 오프셋 행을 건너뛰지 않고 오프셋+N 행을 취한 다음 포기하기 전에 오프셋 행을 반환하고, 오프셋이 특히 큰 경우 N 행을 반환합니다. 단일 데이터도 매우 큽니다. 이때 각 쿼리는 더 많은 데이터를 얻어야 하므로 당연히 속도가 매우 느려집니다.
최적화 계획:
SELECT * FROM table JOIN (select id from table where condition1 = 0 and condition2 = 0 and condition3 = -1 and condition4 = -1 order by id asc LIMIT 2000 OFFSET 50000) as tmp using(id)
또는
SELECT a.* FROM table a, (select id from table where condition1 = 0 and condition2 = 0 and condition3 = -1 and condition4 = -1 order by id asc LIMIT 2000 OFFSET 50000) b where a.id = b.id
먼저 기본 키 목록을 가져온 다음 기본 키를 통해 대상 데이터를 쿼리합니다. 모든 필드 데이터 대신 많은 기본 키를 얻는 것이 상대적으로 더 효율적입니다.
관련 권장 사항:
일반적으로 사용되는 mysql 최적화 sql 문 쿼리 방법 요약
위 내용은 mysql 페이징 중 오프셋이 너무 큰 경우 공유하는 SQL 최적화 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!