찾다

 >  Q&A  >  본문

mysql - 为什么limit前面加上order by 索引查询性能会更好?

ringa_leeringa_lee2863일 전923

모든 응답(5)나는 대답할 것이다

  • PHPz

    PHPz2017-04-17 16:47:33

    테스트용으로 2,500만 개의 데이터가 포함된 테이블을 찾았습니다. ID는 자동 증가 기본 키입니다.

    다음 명령문을 사용하여 테스트하고 쿼리 캐시를 끄고 각 단계를 연속 10번 실행하고 평균 시간을 계산합니다.

    <테이블><본문> SELECT * FROM user_orders 제한 100000,10; 71.3ms SELECT * FROM user_orders ID 설명 제한에 따른 주문 100000,10; 83.4ms SELECT * FROM user_orders ID 기준 오름차순 제한 100000,10; 69.3ms SELECT * FROM user_orders 제한 200000,10; 133.2ms SELECT * FROM user_orders ID 설명 제한 200000,10별 주문; 178.4ms SELECT * FROM user_orders ID 기준 오름차순 제한 200000,10; 133.4ms SELECT * FROM user_orders 제한 10000000,10; 6429.5ms SELECT * FROM user_orders ID 설명 제한에 따른 주문 10000000,10; 8270.9ms SELECT * FROM user_orders ID 기준 오름차순 제한 10000000,10; 6918.7ms

    리미트 오프셋이 작은 경우 인덱스에서 몇 개의 행만 스캔하려면 order by를 추가하는 것이 더 빠르며, 오프셋이 큰 경우 order by를 추가하는 것이 더 느리고 전체 테이블 스캔이 더 빠릅니다.

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-17 16:47:33

    색인이 추가되지 않은 경우 SELECT * FROM sys_client LIMIT 100000,10은 전체 테이블을 검색한 다음 100001~100010의 10개 레코드를 가져옵니다. 인덱스를 추가하면 테이블 전체가 아닌 100010개의 레코드만 검색되므로 실행 효율이 더 좋아질 것입니다!

    회신하다
    0
  • PHPz

    PHPz2017-04-17 16:47:33

    order by가 없는 첫 번째 문에서 mysql 처리 단계는 다음과 같습니다.

    <올>
  • 명령문을 기반으로 10개의 데이터를 검색합니다.

  • 10개의 데이터를 정렬하세요.

  • 이 10개의 데이터를 반환합니다.

  • 그러나 두 번째 명령문에서는 id 필드가 기본 키 인덱스라고 가정하고 mysql 처리 단계는 다음과 같습니다.

    <올>
  • 10개의 데이터를 가져옵니다.

  • 정렬된 데이터를 직접 얻으려면 인덱스 시퀀스를 사용하세요.

  • 이 10개의 데이터를 반환합니다.

  • 요약하자면:
    order by 필드가 실행 중에 색인을 활용하는 경우. 인덱스 시퀀스를 사용하여 정렬된 데이터를 직접 얻을 수 있습니다. 그렇지 않은 경우 정렬 작업이 수행됩니다.

    회신하다
    0
  • 怪我咯

    怪我咯2017-04-17 16:47:33

    당신의 신분증은 색인되어 있나요?

    회신하다
    0
  • 迷茫

    迷茫2017-04-17 16:47:33

    0.0001... 더 복잡한 SQL을 검증해야 합니다

    회신하다
    0
  • 취소회신하다