복합인덱스에서 범위 조건은 뒤로 가야 효율이 좋다고 하는데 실제로 테스트를 해보니까 뒤로 가야 모든 컬럼이 인덱스를 타더라구요.
근데 이해가 안갑니다.... 왜 범위조건이 먼저 나오면 안되는지 실제로 범위조건 뒤는 인덱스가 아니라 필터로 처리되던데....
이게 목차로 따지면 복합인덱스는 첫번째 컬럼으로 큰 목차를 만들고 만들어진 큰 목차 하나하나에 작은 목차들이 생성된다고 생각하면 되는건가요?
이렇게 되면 먼저 범위 조건을 하면 그 안에 있는 작은 목차들을 하나하나 찾아야 되서 필터처리가 되는건 이해가 가는데 반대의 경우는 이해가 안가더라구요. 먼저 값에 해당하는 목차들을 선별해서 그 안에서 범위를 비교하는 느낌인건가요?
혹시 하나만 더 여쭤봐도 될까요...
1. 선분 + 점 인덱스
2. 점 + 선분 인덱스
1번 인덱스는 블록을 읽어들인 개수가 27,000,000개(9초 걸립니다) 정도이고 2번 인덱스는 4,000,000개(3초 걸립니다)를 읽습니다.
근데 인덱스를 아예 만들지 않고 그냥 쿼리를 실행하면 1,000,000개(9초에서 10초 걸립니다) 읽더라구요. 속도는 2번 인덱스를 사용한게 3배 이상빠른데 읽어들인 블록의 수가 더 적을 수가 있나요?
이게 인덱스를 사용하면 single block i/o고 사용하지 않으면 multi block i/o라고 하던데 그러면 1,000,000개가 single block이 아니라 multiblock이라는 뜻인가요? 그래서 개수가 더 적은거일까요?
읽어들인 블록수는 버퍼캐시에서 읽은거랑 디스크에서 읽은거랑 합치면 될거라고 생각해서 합쳐서 말씀드렸습니다.
2천 7백만은 1. 선분+점 인덱스를 쓰면 총 읽은 블록수가 그렇더라구요.
Buffers: shared hit=26783124 read=115327, temp read=41390 written=41515
4백만은 2. 점+선분 인덱스를 사용했더니 읽은 블록수가 그렇습니다.
Buffers: shared hit=4003518 read=2452, temp read=40641 written=40766
백만은 인덱스없이 돌리니까 Buffers: shared hit=354 read=943706
이렇게 나온겁니다.