MySQL의 제한 사용법: 쿼리 문을 사용할 때 데이터의 처음 몇 행 또는 중간 행을 반환해야 하는 경우가 종종 있습니다. 걱정하지 마십시오. mysql은 이미 그러한 기능을 제공하고 있습니다.
SELECT * FROM table LIMIT [오프셋,] 행 행 OFFSET 오프셋
LIMIT 절을 사용하면 SELECT 문이 지정된 수의 레코드를 반환하도록 강제할 수 있습니다. LIMIT는 하나 또는 두 개의 숫자 인수를 허용합니다. 매개변수는 정수 상수여야 합니다. 두 개의 매개변수가 제공되는 경우 첫 번째 매개변수는 처음으로 반환되는 레코드 행의 오프셋을 지정하고, 두 번째 매개변수는 반환되는 레코드 행의 최대 개수를 지정합니다. 초기 레코드 행의 오프셋은 0(1 대신)입니다. PostgreSQL과의 호환성을 위해 MySQL은 LIMIT # OFFSET # 구문도 지원합니다.
mysql> SELECT * FROM table LIMIT 5,10; // 레코드 행 6-15 검색
//특정 오프셋부터 레코드세트 끝까지의 모든 레코드 행을 검색하려면 -1을 두 번째 매개변수로 지정할 수 있습니다.
mysql> SELECT * FROM table LIMIT 95,-1; // 마지막 레코드 행 96을 검색합니다.
//매개변수가 하나만 주어지면 최대 레코드 행 수를 반환한다는 의미입니다.
mysql> SELECT * FROM table LIMIT 5; //처음 5개의 레코드 행을 검색합니다.
//즉, LIMIT n은 LIMIT 0,n과 동일합니다.
한도 10과 한도 9,1의 차이점에 유의하세요.
예를 들어:
1.
* 선택 백과사전에서 ID>=(
다음에서 최대(ID)를 선택하세요(
백과사전에서 ID 선택 ID 제한 90001로 주문
)tmp로
) 제한 100;
2.
* 선택 백과사전에서 ID>=(
다음에서 최대(ID)를 선택하세요(
백과사전에서 ID 선택 ID 제한으로 주문 90000,1
)tmp로
) 제한 100;
마찬가지로, 90,000개 이후에 다음 100개의 레코드를 얻는다면 첫 번째 문장과 두 번째 문장 중 어느 것이 더 빠른가요?
첫 번째 문장은 먼저 처음 90001개의 레코드를 가져와서 가장 큰 ID 값을 시작 식별자로 가져온 다음 이를 사용하여 다음 100개의 레코드를 빠르게 찾는 것입니다. 두 번째 문장은 마지막 90000개의 레코드만 가져온 다음 해당 값을 가져오는 것입니다. ID 값입니다. 시작 표시를 사용하여 100개의 레코드 중 첫 번째 문장을 찾고 100개의 행을 세트(0.23)초에 실행합니다.
세트(0.19)초에 문장 2.100행의 실행 결과
실제로 두 번째 문장은 다음과 같이 단순화될 수 있습니다.
* 선택 백과사전에서 ID>=(
백과사전 한도 90000,1에서 ID 선택
)한도 100;
Max 연산을 거치지 않고 90,000번째 레코드의 ID를 직접 사용하는 것이 이론적으로는 더 효율적이지만 실제로는 positioning ID가 1개의 레코드만 반환하고 Max는 거의 그럴 필요가 없기 때문에 효과가 거의 눈에 띄지 않습니다. 결과를 얻을 수 있지만 이렇게 작성하는 것이 더 명확하고 명확하여 뱀을 그릴 필요가 없습니다.
상위 100개 선택 * 백과사전에서 ID>=(
다음에서 상위 90001 Max(ID) 선택(
백과사전에서 ID 선택 ID로 주문
)tmp로
)
하지만 저장 프로시저에서 구현하든, 코드에서 직접 구현하든 항상 병목 현상은 MS-SQL의 TOP가 항상 첫 번째 N개의 레코드를 반환한다는 점입니다. 데이터의 양이 많지 않으면 이러한 상황은 크게 느껴지지 않습니다. 수백, 수천 개가 있으면 효율성은 확실히 낮을 것입니다. 이에 비해 MySQL의 한계에는 많은 장점이 있습니다.
,구현하다:
백과사전 한도 90000에서 ID 선택
백과사전 한도 90000,1에서 ID 선택
결과는 다음과 같습니다.
세트당 90000행(0.36)초
세트당 1줄(0.06)초
MS-SQL은 Select Top 90000 ID From cyclopedia만 사용할 수 있으며, 실행 시간은 390ms이며, 동일한 작업의 실행 시간은 MySQL의 360ms만큼 좋지 않습니다.
한계 오프셋은 레코드가 많을 때 사용됩니다. 레코드가 적을수록 오프셋이 작아지므로 직접 한계를 사용하는 것이 좋습니다. 오프셋이 클수록 후자가 더 좋습니다.
///////////////////////////////////////////////// /// /////////////////////////
1. 오프셋이 상대적으로 작은 경우.
yanxue8_visit 제한 10,10에서 *를 선택하세요.
여러 번 실행하면 시간이 0.0004-0.0005 사이로 유지됩니다.
선택 * yanxue8_visit에서 vid >=(
yanxue8_visit에서 비디오 선택 비디오 제한 10,1로 주문
) 제한 10
여러 번 실행하면 시간은 0.0005-0.0006, 주로 0.0006 사이로 유지됩니다.
결론: 오프셋 오프셋이 작은 경우에는 한계를 직접 사용하는 것이 좋습니다. 이 표시는 하위 쿼리로 인해 발생합니다.
2. 오프셋이 큰 경우.
yanxue8_visit 제한 10000,10에서 *를 선택하세요.
여러 번 실행해도 시간은 약 0.0187로 유지됩니다.
선택 * yanxue8_visit에서 vid >=(
yanxue8_visit에서 동영상 선택 주문 동영상 한도 10000,1 기준
) 제한 10
여러 번 실행한 후에도 시간은 이전의 1/3에 불과한 약 0.0061로 유지됩니다. 사전 설정된 오프셋이 클수록 후자가 더 좋습니다.
///////////////////////////////////////////////// /// ////////////////////////////////////////////// /
mysql> SELECT * FROM table LIMIT 95,-1; // 마지막 레코드 행 96을 검색합니다.
//파라미터가 하나만 주어지면 최대 레코드 행 수를 반환한다는 의미
이 기사는 CSDN 블로그에서 가져온 것입니다. 재인쇄할 때 출처를 표시하십시오: http://blog.csdn.net/zhqingyun163/archive/2009/12/22/5053579.aspx