45 MySQL의 전투 스트레스 연구 노트 : "어떻게 제대로 임의의 메시지 (강의 17)을 표시?

 첫째, 프라이머

당신이 문에 의해 순서를 설명하는 여러 모델의 구현을 완료 한 후 나는 지난 글에있어, 영어 앱 친구 학습에 문제가 전에 성능을하기의 생각은 건너. 오늘이 글은,이 성능 문제로 시작합니다, 그리고
당신은 MySQL을 정렬 로직의 이해를 깊게하기를 바라고, 또 다른 종류의 MySQL의 요구에 대해 이야기.

영어 앱 홈 학습이 시간은 각 사용자의 수준에 따라 단어 목록입니다 임의의 단어 표시 기능을 가지고, 다음 사용자는 홈 페이지는 세 개의 무작위로 단어를 통해 스크롤 방문 할 때마다. 그들은 하나 같이 발견
어휘가 커질수록, 논리가 느린 속도가 느린하게 단어를 선택하고, 심지어 가정의 오픈 속도에 영향을 미칩니다.

이 SQL 문을 설계 할 경우 지금, 당신은 그것을 어떻게 쓸 것인가?

이해의 편의를 위해,이 간단한 예 수의 나 : 단어 목록 단어 목록에서 직접 대응하는 무작위로 세 단어를 선택한되어있다 각 사용자의 논리 레벨을 제거 할 수 있습니다. 건설 및 초기 데이터 테이블 문을 다음과 같이이 명령 테이블 :

MySQL은> (TABLE`words`을 CREATE
  `id`의 INT (11) NOT NULL AUTO_INCREMENT,
  `word` VARCHAR (64) 초기 NULL,
  PRIMARY KEY (`id`)
) ENGINE = 이노;

구분;
() 프로 시저 IDATA를 만들
시작
  난 int로 선언;
  I = 0을 설정;
  내가있는 동안 <10000 DO
    즉 삽입 (워드) 값 (CONCAT (CHAR (97+ (나는 1000)), 숯 (97+ (I의 ~ 1000 DIV 100)), 숯 (97+ (I의 100 % DIV 10)), 숯있는 div (97 + (I 내지 10 %))));
    난 = I + 1 세트;
  단부 동안;
종료;;
구분;

) IDATA (전화;

설명의 편의를 정량화를 위해, 나는 내이 테이블에 10,000 행을 삽입했다. 다음으로, 우리는 무작위로 세 단어를 선택하는 모습을 달성하기 위해 어떤 방법, 어떤 문제가 존재하고 어떻게 개선 할 수 있습니다.

둘째, 임시 메모리 테이블

첫째, 당신은이 논리를 달성하기 위해 랜드 ()에 의해 순서를 사용하여 생각합니다.

MySQL의> 랜드로 단어 순서에서 선택 워드 () 3 제한;

1, 임시 메모리 테이블을 주문, 그것은 알고리즘의 종류를 선택하는 것입니다?

이 문은 매우 간단 의미, 처음 세 개의 무작위 주문을 받아. 이 SQL 문 표현은 매우 간단하지만,하지만 구현 과정이 조금 복잡하다.

의이 성명의 이행을 보려면 명령을 설명 사용하자.

그림 (1) 성명의 이행을 보려면 명령을 설명 사용

1, 일시적으로 사용이 무엇을 의미합니까?

, filesort를 사용하여 정렬 작업을 수행 할 필요성을 나타낸다 일시적으로 사용하여 추가 필드 쇼, 임시 테이블을 사용할 필요가 나타냅니다

추가 그래서이, 당신은 임시 테이블을해야하고, 임시 테이블을 정렬 할 필요가 있다는 것을 의미한다.

여기에서, 당신은 첫 번째 전체 필드가 ​​정렬 및 ROWID를 정렬에있는 문서의 내용을 볼 수 있습니다. 난 당신이 검토 할 수 있도록, 이상 게시 된 기사에 두 플로우 차트를 넣어.

 

 

 도 전체 필드의 종류 2

 

 

 도 3의 ROWID 주문

그럼 난 당신이 질문을 임시 메모리 테이블을 주문하는 당신은 생각 하는가, 그것은 알고리즘의 종류를 선택하는 것입니다? 기사에 대한 결론을 기억 : InnoDB의 테이블의 경우, 전체 필드 순서는 디스크 액세스를 줄일 수행
때문에 선호 될 것입니다, 부탁드립니다.

I 메모리 데이터에 직접 액세스하려면, 다시 표 프로세스에 단순히 위치 데이터 라인을 기반으로, 메모리 테이블에 대해 "InnoDB의 테이블,"당신이 생각해야합니다 강조, 그것은 멀티 액세스 디스크로 이어질하지 않습니다. 최적화가 아닌이 계층 문제를 않습니다

그 다음은 우선 순위가 될 것입니다, 선은 가능한 한 작은 정렬에 사용되며, 따라서 MySQL은 다음 ROWID 종류를 선택합니다.

2, 무작위로 전체 프로세스를 주문

이 알고리즘 선택의 논리를 이해, 우리는 실행 흐름 문 봐. 동시에,이 예 오늘을 통해, 우리는 명령문의 주사선의 수를 분석하려고합니다.

이 문장의 실행의 흐름은 이것이다 :

1. 임시 테이블을 생성합니다. 엔진을 사용하여 메모리 임시 테이블은 테이블 필드 W.라고도 필드 R, 제 2 필드는 VARCHAR되는 (64)에 입력 함 제 1 필드는, 편의를 위해, 후술하는 두 종류이며, 두 개의 필드를 가지고 또한,이 테이블은 인덱싱되지 않습니다.

2. 테이블의 기본 키 단어 순서 단어의 모든 값을 제거합니다. 각 단어에 대한 값, 전화 랜드 () 함수는 이하의 (1)에 임의의 십진수 0 초과를 생성하고,이 단어는 임의의 소수 임시 테이블에 저장된
    R 및 W 필드이 주사선 수가 10,000.

이제 데이터 만 개 임시 테이블 행이 3이고, 다음은 당신이 필드 R의 종류에 따라, 임시 테이블 메모리에 색인을 원하지 않는다.

4. 초기화 sort_buffer. sort_buffer는 다른 정수, 두 개의 필드, 타입 더블 있습니다.
5. (내 뒤에 당신은 여기에 "위치 정보"이유를 설명) 메모리 임시 테이블에서 줄과 위치 정보에 의해 R 값 줄을 제거 sort_buffer 두 개의 필드로, 각각. 이 과정은 전체 테이블 메모리 임시 테이블 수행
    , 주사선 10000의 수를 증가하는이 시간을 스캔, 20,000되었다.
제 sort_buffer에서 R의 값에 따라 분류. 이 프로세스가 작동 테이블에 관련이 없습니다, 그래서 그것은 주사선의 수를 증가하지 않습니다.
분류가 완료되면, 상기 위치 정보의 세 가지 결과를 삭제 7. 임시 메모리 테이블은 연속적 다시 클라이언트 워드 값을 추출 하였다.

1, 학습 방법을 권장

이 프로세스는, 데이터 테이블의 세 줄을 방문, 스캔 라인의 총 수는 20,003이된다.

다음으로, 우리는 느린 쿼리 로그 (느린 로그) 분석이 정확 얻을 주사선의 수를 확인하기를 전달합니다.

# Query_time : 0.900376 Lock_time : 0.000347 Rows_sent : 3 Rows_examined : 20003
SET 타임 스탬프 = 1541402277;
랜드로 단어 순서에서 선택 워드 () 3 제한;

어느, Rows_examined : 20003 스캔 라인 20003의 실행시이 사항이, 그것은 우리의 분석은 결론의 유효성을 검사했다.

여기에 개념 학습의 정상적인 과정에서, 여담을 삽입, 당신은 항상 그렇게 할 수있는 첫 번째 분석의 원리에 의해 주사선의 수를 계산 한 다음 자신의 결론을 확인하기 위해 느린 쿼리 로그를보고 . 나 자신이있다, 이렇게 자주 나는
분석이 잘못뿐만 아니라 매우 행복했다 알아낼, 매우 흥미로운 과정, 행복한 분석.

3, 완전한 무작위 순서의 흐름도

지금, 나는 밖으로 정렬의 구현 프로세스의 완전한 그림에 온다.

완전한 랜덤 순서,도 4의 흐름도.

POS, 당신은 어떤 개념을 여기서 "위치 정보"를 그림의 위치 정보입니다 궁금 할 것이다입니까? 이전 글, 우리, 분명히와 ID 필드 또는 InnoDB 테이블에서 주문시.

4, MySQL의 테이블은 "광고 데이터"를 찾기 위해 사용되는 방법이다.

이 때, 우리는 기본 개념을 다시거야 : MySQL의 테이블이 "라인 데이터"를 찾는 데 사용하는 방법입니다.

4와 5의 앞 테이블에 다시 방법이 없습니다, 기본 키없는없는 InnoDB의 테이블의 기본 키가 삭제 한 경우 여러 학생들이 물었다, 기사의 인덱스를 소개?

음, 정확히. 마찬가지로 당신이 기본 키가없는 테이블을 만들거나 테이블의 기본 키를 삭제할 경우, 다음 InnoDB의 6 바이트의 길이가 기본 키에 rowid로 소유 생성합니다.

이것은 내부의 분류 모드, 이름의 ROWID 기원합니다. 사실 그것은 대표 : 각 엔진 고유 정보의 행을 식별하는 데 사용됩니다.

  1. 이노 기본 키 테이블이 기본 키 ID의 ROWID이고;
  2. InnoDB의 테이블은 기본 키가없는 경우,이 ROWID는 시스템에 의해 생성됩니다;
  3. MEMORY 엔진은 인덱스 구성 테이블이 아닙니다. 가이 경우에, 당신은 배열로 생각할 수 있습니다. 그래서,이 사실은 ROWID 배열 인덱스입니다.

여기, 좀 요약을 살펴 보겠습니다 : 순서를 랜드에 의해 ()는 정렬 테이블 정렬 방법 rowid로 사용하는 경우 메모리 임시 테이블, 임시 메모리를 사용합니다.

셋째, 디스크 임시 테이블

1, 다음, 모든 임시 테이블은 메모리 테이블이 있습니다되지 않는 이유는 무엇입니까?

음, 정확히. 이 구성은 임시 메모리 테이블의 크기를 제한 tmp_table_size 변수의 기본값은 16M입니다. 임시 테이블의 크기가 tmp_table_size 변수를 초과하는 경우, 그들은 임시 테이블 메모리 디스크 임시 테이블로 바뀝니다.
기본 엔진을 사용하여 디스크 임시 테이블은이 internal_tmp_disk_storage_engine의 매개 변수에 의해 제어되고, 이노입니다.

디스크 임시 테이블을 사용하는 경우, 해당 정렬 프로세스는 어떤 InnoDB의 테이블을 명시 적으로 인덱스입니다. 이 과정을 재현하려면 I 1024로 설정 tmp_table_size 변수의 sort_buffer_size는 설정
, 32768 (16)로 설정 max_length_for_sort_data합니다.

세트 tmp_table_size 변수 = 1024;
sort_buffer_size = 32768 세트;
세트 max_length_for_sort_data = 16;
/ * 오픈 optimizer_trace 만 현재 스레드에 대한 * /
SET의 optimizer_trace은 = '에 = 활성화'; 

/ * 문을 실행 * /
랜드로 단어 순서에서 선택 워드 () 3 제한;

/ * 확인 OPTIMIZER_TRACE 출력 * /
information_schema`.`OPTIMIZER_TRACE` \ G 'SELECT * FROM

 

 

 도 5 부 OPTIMIZER_TRACE 결과

그런 다음, 우리는이 OPTIMIZER_TRACE의 결과를 봐주세요.

16으로 설정 max_length_for_sort_data이 필드에서 정의 된 워드 길이보다 작으므로, 우리는 ROWID 정렬을 도시 sort_mode, 이것은 기대와 일치하며 랜덤 값 R 워드 정렬에 관련되어 참조
선분 및 ROWID 필드.

당신이 마음을 잊을 수있다이 때, 내가 잘못했습니다. (그들이 생각하는 수업 후 당신을 떠날 이유에 관해서는 6 바이트) 임의의 값 R 필드가 8 바이트에 저장되어, ROWID는 데이터의 행 수, 그래서 계산 만 6 바이트
140,000 바이트가 , sort_buffer_size 이상 32,768 바이트 정의했다. 그러나 값이 0 number_of_tmp_files 임시 파일을 사용할 필요가 없습니다, 사실입니까?

(2) 우선 순위 큐 정렬 알고리즘

우선 순위 큐 정렬 알고리즘 : SQL 문 이런 종류의 MySQL의에서, 즉 5.6 버전을, 도입 된 새로운 정렬 알고리즘을 사용하여 임시 파일을 사용하지 않습니다. 다음으로, 우리는 어떤 알고리즘이 임시 파일을 사용하지 왜 거기에 대해 살펴
즉, 대신 우선 순위 큐 정렬 알고리즘을 사용하는 정렬 알고리즘을 병합합니다.

사실, 우리는 SQL 문에만 R 3 ROWID의 최소 값을 취할 필요, 지금. 당신도 처음 세 값을 얻을 결국 수 있지만, 정렬 알고리즘을 병합 사용하지만,이 알고리즘의 끝,이 경우, 데이터의 10,000 선
까지 분류되어 있습니다.

즉, 9997 라인 뒤에 질서이다. 그러나, 우리는 데이터가 정렬 쿼리 할 필요가 없습니다. 그래서, 내가 이해하기에 대한 생각이 계산을 많이 낭비입니다.

우선 순위 큐잉 알고리즘은, 정확하게 세 개의 최소를 얻을 수있다 다음과 같이 구현 과정은 :

(데이터 구조 학생 세 요소의 첫 번째 어레이 것으로 생각된다 모호한 인상 1)]이 준비 1. 스택으로 구성된 제 세 라인을 취할 10,000 (R, ROWID) 주문 한 행 (R ', ROWID')를 삭제

    반응기 R 내부의 최대 전류를 비교하여, R '는 (ROWID'R)에 스택으로부터 제거 R이 (R, ROWID) 미만 '경우;

10000까지의 2 단계를 반복하여 2 (R ', ROWID')는 비교를 완료한다.

여기서, I는 단순히 우선 순위 큐 정렬 프로세스의 다이어그램을 끌었다.

도 3을 참조하면, 우선 순위 대기열을 분류하는 과정의 개략도

실시 예 6도 우선 순위 큐 정렬 알고리즘

도 6은도 6 (R, ROWID) 행 우선 순위 큐에 따라 정렬 세 R의 최소값을 찾는 열 처리의 시뮬레이션이다. 전체 주문 과정, 위해 항상 힙의 상단에있는 최대 값을 유지하는 가장 빠른 현재 최대 힙을 얻을, 그래서 이것은 가장 큰 힙 중 하나입니다 수있다.

.도 5 filesort_priority_queue_optimization의 OPTIMIZER_TRACE 결과이 섹션은,이 프로세스가 이에 대응하여 임시 파일을 필요로하지 않는 것이 정렬 알고리즘의 우선 순위 큐의 사용을 의미 = TRUE 선택
number_of_tmp_files 0이다.

이 공정 후, 우리는 R 값 안에 000 개의 행의 세 라인의 최소이고, 반응기 내부의 구성. 자신의 ROWID 필드 내부의 단어 임시 테이블을 얻기 위해 밖으로 촬영에 그런 다음, 바로 이전 기사처럼,이 과정을 설정
ROWID 주문 프로세스처럼.

의 위의 SQL 쿼리의 기사를 살펴 보자 :

t에서 도시, 이름, 나이를 선택한 경우 이름 제한 1000에 의해 도시 = '杭州'위해;

MySQL의 테이블은 "라인 데이터"를 찾는 데 사용하는 방법입니다.

당신은 잘 한계로 여기에 사용, 요청할 수 있습니다, 얼마나 쓸모 그것을 정렬 알고리즘 우선 순위 큐? 그 이유는이 SQL 문을 사용하여 우선 순위 큐 알고리즘을 사용하는 경우, 그것은 1000 선 스택 유지 보수의 크기입니다 필요 한계 1000이며,
더 내 설정의 sort_buffer_size 크기보다 (이름, ROWID), 그래서에만 사용 병합 정렬 알고리즘을.

즉, 랜드에 의해 일시적으로 사용하는 테이블, 순서에 상관없이 어떤 종류의 ()와 같은 접근 방식은 주사선의 큰 숫자를 필요로하는, 계산 과정이 매우 복잡 할 것, 정렬 프로세스의 자원 소비가 큰 것입니다.
우리는 얼마나 제대로 무작위 분류 않는, 다시 기사 문제의 처음으로 이동?

임의 순서의 넷째, 방법

1 1 확률 적 알고리즘

단지 무작위로 단어 값을 선택하면 우리는 먼저 어떤 문제를 단순화하는 방법을 할까? 아이디어는 이것이다 :

  • 1. 테이블의 기본 키는 최대 값 M과 최소값 번호 N을 획득하는 단계;
  • 2. N + X = (MN)의 최소 개수 * 랜드 () 사이의 최대 값을 갖는 임의의 함수를 생성하고;
  • 라인을 가지고 3. X는 최초의 ID 이상이다.

우리는이 알고리즘, 가칭라는 확률 알고리즘을 호출합니다. 여기, 당신이 명령문의 실행 순서에 대해 게시에 직접 :

MySQL의> @ M, N으로 @ t에서 최대 (ID), 분 (ID)를 선택;
@ X = 층 세트 ((@ M- @ N + 1) * 랜드 () + @N);
t 행 *을 선택 여기서 ID> = @X 한도 1;

권취 최대 (ID)와 분 (ID)의 인덱스를 검색 할 필요가 있으며, 또한 신속하게 위치 결정 지표를 선택할 수있는 세 번째 단계에서는,이 세 개의 주사선으로 간주 될 수 있기 때문에이 방법은 매우 효율적이다. 그러나 사실, 알고리즘 자체는하지 않는
엄격하게 임의의 주제의 요구 사항을 충족 다른 라인을 선택하는 확률은 동일하지 않습니다 진정으로 무작위되지 않도록 중간 ID가 비어있을 수 있기 때문이다.

예를 들어, 상기 방법에 따라, 4- ID 각각 1,2,4,5-이 후, 2 회의 다른 라인의 확률 식 (4)의 라인이 확률 걸릴.

ID의이 네 줄은 1,2,40000,40001이 있다면? 기본 알고리즘은 버그로 볼 수 있습니다.

2, 확률 적 알고리즘 2

따라서, 엄격한 임의의 결과를 얻기 위해서는 다음과 같은 절차를 사용할 수 있습니다 :

  • 전체 테이블의 행 수를 가져 오기 및 C로 표시하십시오
  • 2 층 Y = 구하는 (C *의 랜드가 ()). 여기서 정수 부분을 가지고있다 바닥 함수의 역할.
  • 3. 다음 행 페치 1, Y를 제한한다.

우리는 무작위 알고리즘 2로 알려진이 알고리즘을 호출합니다. 다음 코드는 프로세스 위의 문장의 실행 순서입니다.

매개 변수는 변수 한계 바로 뒤에 할 수 없기 때문에, 그래서 상기 코드 방법을 실행할 준비 + 사용. 당신은 또한 응용 프로그램에서 SQL 문을 작성하는 접합 방법을 넣을 수 있습니다, 그것은 간단합니다.

이 랜덤 알고리즘 2, 알고리즘 1은 별개의 확률 내부 얼룩의 문제를 해결한다.

MySQL의> t에서 @C로 선택 수 (*);
@Y = 층 세트 (@C * 랜드 ());
( "1"을 @Y "t 제한 SELECT *") = @Sql CONCAT 설정;
@Sql에서 STMT 준비;
STMT 실행;
STMT를 준비 할당 해제;

MySQL의 프로세스 한계는 Y, 하나 개의 접근법은 드로 전에 하나씩 Y를 순차적으로 판독되고, 그 후 결과로서 다음 레코드를 반환하므로이 단계는 주사선 Y + 1을 필요로한다. 또한, 첫 번째 단계의 C 선 주사, 총 필요
C + Y + 1 개 라인을 스캔하는, 실행 비용은 확률 적 알고리즘 (1)의 비용보다 높다.

물론, 랜드에 의해 직접 순서 무작위 알고리즘 2 ()를보다 실행 비용은 여전히 많이 작다.

이 표에 따라, C = 10000을 계산하기 만 개 라인이있는 경우, 질문 및 수도 경우 Y의 비교적 큰 값, 다음 주사선의 수뿐만 아니라 주사선 랜드 ()의 수에 의하여 20,000 거의 가까운 순서 및 랜덤 왜와
기계 비용이 알고리즘은 훨씬 작습니다? 나는 방과 후 그것에 대해 생각으로 이동하는 당신에게 떠날 것이다.

랜덤 알고리즘 3이라 3

임의의 알고리즘을 무작위로 세 단어 값을 선택하는 경우 이제, 우리는 우리가 2를 생각 봐? 이 작업을 수행 할 수 있습니다 :

  • 1. 전체 테이블의 행의 수를 얻기 위해 C이다 칭하여
  • 2 같은 임의의 방법에 따라 수득 Y1, Y2, Y3;
  • 다음 명령문으로 한계 세 Y 1, 3을 수행하여 세 개의 데이터 라인이다.

우리는 무작위 알고리즘 3로 알려진이 알고리즘을 호출합니다. 다음 코드는 프로세스 위의 문장의 실행 순서입니다.

MySQL의> t에서 @C로 선택 수 (*);
세트의 Y1 = @ 층 (랜드 @C * ());
세트의 Y2 = @ 층 (랜드 @C * ());
세트의 Y3 = @ 층 (랜드 @C * ());
t 한계에서 *를 선택 @ Y1,1, 주문 후 // 응용 프로그램 코드 Y1 내부로 들어가, Y2, Y3 값의 SQL
Y2,1 @ t 한계에서 *를 선택;
Y3,1 @ t 한계에서 *를 선택;

V. 요약

당신은 MySQL의 임시 테이블 정렬의 구현의 과정을 설명과 함께 오늘이 문서는, 나는 무작위 수요 명령을 받았다. 쿼리 실행 비용은 상대적으로 큰 경향이있다. 양을 설계 할 때, 당신은 이러한 접근을 방지 할 수 있습니다.

직접) (랜드로 주문하는 경우,이 사항은 임시 사용 및 filesort를 사용하여 필요

오늘날의 예를 내부에서, 우리는 데이터베이스 내에서 문제를 해결할뿐만 아니라 바느질 SQL 문을 사용하여 응용 프로그램 코드를 수 있도록뿐만 아니라입니다. 그 정도의 수, 비즈니스 코드에서 비즈니스 로직을 작성하려고 : 실제 응용 프로그램에서 사용은 상당히 표준
데이터베이스은 "읽기 - 쓰기 데이터"일. 따라서, 이러한 방법의 응용 프로그램은 매우 광범위하다.

마지막으로, 나는 막대에 대한 생각으로 당신을 떠나지.

랜덤 알고리즘 상기 주사선 3 총계 C를 + (Y1 + 1) +는, 최적화 계속 상기 주사선의 수를 줄이기 위해 실제로 (Y2 + 1) + (Y3 + 1)이다.

당신이 개발자가이를 필요로하는 경우 내 질문입니다, 어떻게 그것의 주사선의 수를 줄이기 위해 할 것인가? 프로그램에 대해 말해 및 프로그램 요구의 주사선의 수를 설명합니다.

당신은 당신의 디자인과 코멘트 섹션에 기록 된 결론을 넣을 수 있습니다 나는 다음 기사를 종료하고이 문제에 대해 설명합니다. 경청 해 주셔서 감사합니다, 당신은 함께 읽고 더 많은 친구에게이 주를 보내 환영합니다.

여섯째, 시간의 문제에

이 SQL 문이 정렬하는 데 필요한, 지난 글에서 나는 도시가에 ( "항주", "소주")의 이름 한계 (100)에 의해 순서가 t SELECT * FROM, 마지막 질문으로 당신을 떠나지? 어떤 프로그램 종류를 피하기 위해?

(도시 이름) 하나의 내부 도시에 대한 공동 인덱스가 있지만, 이름이 증가합니다. 이 SQL 문이 별도로 도시의 가치를 조사, 그러나 동시에 두 도시를 확인하기위한 것이 아닙니다 때문에, "항주"와 "소주", 그래서 모든 전체
발 조건 이름은 증가하지 않습니다. 즉,이 SQL 문은 순서가 필요합니다. 그와 같은 방법을 피하기 위해?

다음과 같이 여기에, 우리는 특성 (도시 이름) 인덱스의 공동 이용해야이 문을 두 문장으로 분할되고, 구현 프로세스는 다음과 같습니다

  • 1. 실행을 선택 * 이름 제한 (100)에 의해 도시 = "항주"주문이 t에서,이 문이 결과를 저장하는 메모리 어레이 (100)의 길이 A와 클라이언트를 정렬 할 필요가 없습니다.
  • 2. 선택 실행 * 이름 한계 (100)에 의해 도시 = "소"t 순서에서, 동일한 방법으로, 결과 가정은 메모리 어레이에 저장된 B.
  • 3. 이제 A와 B 두 개의 정렬 배열, 다음, 생각의 병합 정렬을 사용할 수있는 100의 최소 값의 이름을 얻으려면, 우리가 필요로하는 결과이다.

당신이 SQL 문을 넣을 경우로 변경 "(100)는 제한" "제한 10000,100"즉, 사실, 거의 접근 방식은, 경우 : 위의 두 문장 쓰기에 넣어 :

t SELECT * FROM 곳 도시 = "杭州"이름 제한 10100에 의해 순서; 

 t SELECT * FROM 곳 이름 제한 10100에 의해 도시 = "苏州"순서.

이 때 많은 양의 데이터가 동시에 이름이 10,001 ~ 10,100의 값을 취하기 위해, 결과 세트를 얻기 위해 두 병합 정렬 알고리즘, 결과를 연결하는 두 개의 행으로부터 판독 될 수 있고, 원하는 결과이다.

물론,이 프로그램은 데이터의 상당한 손실이 많은 양의 데이터베이스에서 클라이언트에 반환됩니다있다.

한 행의 데이터가 큰 경우에 따라서, 당신은이 방법으로 작성된 다음에이 두 SQL 문을 고려할 수 있습니다 :

t에서 ID, 이름을 선택한 경우 도시 = "杭州"이름 제한 10100에 의해 순서; 

t에서 ID, 이름을 선택한 경우 이름 제한 10100에 의해 도시 = "苏州"순서.

그런 다음 10001의 주문의 이름에 인수 정렬 프로세스 이름 병합 - 10100, ID의 값을, 모든 기록을 찾기 위해 데이터베이스에 ID (100)를했다.

위의 이러한 방법은, 당신은 성능 요구와 개발의 복잡성에 따라 트레이드 오프를 확인해야합니다.

추천

출처www.cnblogs.com/luoahong/p/11640924.html