항상 Oracle을 사용해 온 사람으로서 오늘은 MySQL에서 동일한 기능이 서로 다른 크기의 성능을 보여 매우 놀랐습니다.
먼저 ibmng(id,title,info) 고유 ID 키 인덱스 제목 테이블을 살펴보세요
먼저 두 문을 살펴보세요.
select * from ibmnglimit 1000000, 10
select * from ibmnglimit 10,10
많은 분들이 별 차이 없을 거라고 생각하시겠지만, 착각입니다. 차이가 너무 크네요.(일부 있을 수도 있습니다) 기계에 따라 다르지만 확실히 10배 이상입니다.) 구체적인 실행 시간은 궁금한 학생들에게 맡깁니다.
이게 왜 다 오프셋 잘못이에요!
최적화하려는 경우 다음과 같이 오프셋을 줄이는 방법을 찾을 수 있습니다.
Select * From ibmng Where id >=(
Select id From ibmng Order By id limit 1000000,1
)limit 10
확실히 문제가 보일 것입니다. 동일한 오프셋과 동일한 크기가 아닌가요? (하지만 또 틀렸어요, 결과는 실행 후에야 알 수 있죠!)
이유는 id가 인덱스라서 빠르기 때문에 다음 sql은 어떨까요:
select id from ibmng where title='mysql' order by idlimit 1000000,10;
모두가 이 SQL에 대해 또다시 틀릴 것이라고 추측할 것이며 또한 달팽이처럼 느립니다. (여기 있는 모든 사람은 제목이 색인화되어 있다고 생각할 것입니다. 왜 이런 일이 발생합니까!)
다음으로 모두는 다음과 같이 또 다른 SQL을 실행합니다.
select id from ibmng where title='mysql'limit 1000000 , 10;
실행해 보면 속도가 sousou만큼 빠르다는 것을 알 수 있습니다!
이는 모두 인덱스 사용 때문입니다. 제목='mysql'에서 ID 제한이 1000000,10인 경우 복합 인덱스를 추가하세요. (제목, 아이디)!
참고: 다음 내용은 제한과 관련이 없습니다!
마지막으로 현재 시나리오로 돌아가서 수천만 개의 데이터를 일괄적으로 읽는 경우 제한을 사용하지 않고 기본 키 범위를 사용하여 판단하는 것이 가장 좋습니다! (예: id<=1001000 및 id>=1000001)