인덱스에도 불구하고 쿼리 성능이 느리다
네 칸으로 된 테이블이 있습니다.
|-----|-----|-----|-----------|
| 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
'programing' 카테고리의 다른 글
Python MySQL이 새로 고쳐지지 않음 (0) | 2022.09.19 |
---|---|
'DOMWindow'에서 'postMessage'를 실행하지 못했습니다. https://www.youtube.com !== http://localhost:9000 (0) | 2022.09.19 |
JDBC DatabaseMetaData#getTables()가 반환됨: ERROR 1463(42000):HAVING 절에 그룹화되지 않은 필드 'TABLE_TYPE'이 사용됩니다. (0) | 2022.09.12 |
Jersey와 Jax-r의 차이점은 무엇입니까? (0) | 2022.09.12 |
exception.printStackTrace()가 잘못된 관행으로 간주되는 이유는 무엇입니까? (0) | 2022.09.12 |