mysql 페이징 중 오프셋이 너무 큰 경우 공유하는 SQL 최적화 예

小云云
풀어 주다: 2017-12-25 11:16:37
원래의
2096명이 탐색했습니다.

목록에 콘텐츠를 표시할 때, 목록에 포함되는 콘텐츠의 양은 많지만 사용자가 한 번에 볼 수 있는 인터페이스의 크기가 제한되어 있기 때문에 필연적으로 페이징 문제가 발생합니다. 한 번에 너무 많은 데이터를 가져오면 백엔드에 추가적인 부담이 가해집니다. 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 최적화 요약 - 총 쿼리 수

일반적으로 사용되는 mysql 최적화 sql 문 쿼리 방법 요약

MySQL 최적화에는 세 가지 측면이 포함됩니다.

위 내용은 mysql 페이징 중 오프셋이 너무 큰 경우 공유하는 SQL 최적화 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿