programing

인덱스에도 불구하고 쿼리 성능이 느리다

luckcodes 2022. 9. 12. 19:58

인덱스에도 불구하고 쿼리 성능이 느리다

네 칸으로 된 테이블이 있습니다.

|-----|-----|-----|-----------|
|  a  |  b  |  c  |     d     |
| int | int | int | timestamp |
|-----|-----|-----|-----------|

이 테이블에는 100,000,000개 이상의 레코드가 포함되어 있습니다.네 개의 열에 대한 인덱스와 (a, b, c)에 대한 하나의 복합 인덱스가 있습니다.

다음 쿼리를 실행하면 정상적으로 동작합니다(몇 밀리초).

SELECT 
  count(*) FROM my_table 
WHERE 
  a = X AND b = Y AND c = Z

기본적으로 약 3000개의 요소를 반환합니다.

단, 컬럼에 조건을 추가하려면d(타임스탬프입니다):

SELECT 
  count(*) FROM my_table 
WHERE 
  a = X AND b = Y AND c = Z AND d < '2018-01-01T00:00:00'

쿼리 응답 시간이 분 단위로 급증합니다.

내가 뭘 놓쳤지?

복합 인덱스가 (a,b,c)에 있으므로 첫 번째 쿼리는 인덱스만 사용하면 됩니다(색인 적용 개념 참조). 따라서 결과를 매우 빠르게 처리할 수 있습니다.서버는 테이블 자체를 열 필요도 없습니다.

열에 기준을 추가하는 경우d, mariadb는 더 이상 복합 지수를 커버링 지수로 사용할 수 없습니다.인덱스는 처음 3가지 기준에 일치하는 레코드를 얻기 위해 쿼리 속도를 높이기 위해 계속 사용되지만, 그 후 mariadb는 큰 테이블로 이동하여 열을 필터링해야 합니다.d 4번째 기준에서 일치하는 기록을 얻기 위해 어떤 색인도 사용하지 않는다.복합 인덱스가 얼마나 선택적인지에 따라 이 작업에는 여전히 많은 시간이 걸릴 수 있습니다.

네 개의 열 모두에 대해 인덱스를 생성하는 실험을 할 수 있지만 전체 가격이 이득보다 클 수 있습니다.

언급URL : https://stackoverflow.com/questions/48527135/slow-performance-on-query-despite-indices