반응형
자동 증분 정수인 기본 키를 기반으로 얻고 싶은 연속 행 집합이 있습니다. 구멍이 없다고 가정하면 다음 사이에 성능이 있습니까?
SELECT * FROM `theTable` WHERE `id` IN (n, ... nk);
과:
SELECT * FROM `theTable` WHERE `id` BETWEEN n AND nk;
해결 방법
BETWEEN
은이 경우 IN
보다 뛰어야합니다 (그러나 실행 계획을 측정하고 확인하는 것도 실행 합니다!), 특히 n
은 증가하고 통계는 여전히 정확합니다. 가정 해 봅시다 :
이론적으로 BETWEEN
은 기본 키 인덱스에서 단일 "범위 스캔"(Oracle 말하기)으로 구현 된 다음 최대 n
인덱스 리프 노드를 순회 할 수 있습니다. 복잡성은 O (n + log m)
IN
은 일반적으로 기본 키 인덱스에서 n
"범위 스캔"의 일련 (루프)으로 구현됩니다. m
이 테이블의 크기 인 경우 복잡성은 항상 O (n * log m)
... 이는 항상 더 나쁩니다. > m 또는 매우 작은 범위 n
)
어쨌든 전체 테이블 스캔을 받고 각 행에서 조건자를 평가합니다.
BETWEEN
은 두 개의 술어를 평가해야합니다. 하나는 하한 용이고 다른 하나는 상한 용입니다. 복잡성은 O (m)
IN
은 최대 n
개의 술어를 평가해야합니다. 복잡성은 O (m * n)
... 다시 항상 더 나쁘거나 데이터베이스가 IN 을 최적화 할 수있는 경우
O (m)
입니다. code> 목록은 술어 목록이 아니라 해시 맵이됩니다.
참조 페이지 https://stackoverflow.com/questions/3308280
반응형
'MySql' 카테고리의 다른 글
MySQL Python을 통해 XAMPP mysql에 액세스 (0) | 2020.11.16 |
---|---|
MySQL SQLite 및 맞춤 주문 (0) | 2020.11.16 |
MySQL 워크 벤치를 사용하여 테이블의 열 이름을 변경 (업데이트)하는 방법은 무엇입니까? (0) | 2020.11.16 |
MySQL 맨 왼쪽 테이블의 모든 행에 대해 맨 오른쪽 테이블에서 하나의 행만 반환 (0) | 2020.11.16 |
MySQL 두 암호가 일치하는지 확인하는 등록 양식 (0) | 2020.11.16 |
댓글