반응형
자동 증분 정수인 기본 키를 기반으로 얻고 싶은 연속 행 집합이 있습니다. 구멍이 없다고 가정하면 다음 사이에 성능이 있습니까?
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 |
댓글