programing

쿼리를 최적화하기 위해 타임스탬프에 인덱스 만들기

kingscode 2022. 10. 9. 11:27
반응형

쿼리를 최적화하기 위해 타임스탬프에 인덱스 만들기

다음 양식에 대한 질문이 있습니다.

SELECT * FROM MyTable WHERE Timestamp > [SomeTime] AND Timestamp < [SomeOtherTime]

저는 이 쿼리를 최적화하고 싶습니다만, 타임스탬프에 인덱스를 붙이려고 생각하고 있습니다만,이상적으로는 타임스탬프를 클러스터된 인덱스로 만들고 싶지만 MySQL은 기본 키를 제외하고 클러스터된 인덱스를 지원하지 않습니다.

  • MyTable400달러입니다.
  • Timestamp실제로 같은 종류이다INT.
  • 행은 한 번 삽입되면 변경되지 않습니다.
  • 의 " " " 가 의 수Timestamp20달러 200달러
  • 에는 " " " 가 있습니다.Timestamp이 값은 기존 행의 대부분보다 크지만 최근 행의 일부보다 작을 수 있습니다.

Timestamp이쿼 최적 적적 적적 적? ???

의심에 여지가 없어요.인덱스가 없으면 쿼리는 테이블의 모든 행을 확인해야 합니다.인덱스를 사용하면 올바른 행을 찾는 한 쿼리는 거의 즉시 이루어집니다.당신이 지불해야 할 가격은 삽입물의 약간의 성능 저하입니다만, 그것은 정말로 경미합니다.

당신은 반드시 색인을 사용해야 합니다.MySQL은 타임스탬프가 어떤 순서로 되어 있는지 알 수 없으며, 특정 타임스탬프(또는 타임스탬프 범위)에 대한 레코드를 찾으려면 모든 레코드를 조사해야 합니다.그리고 4백만 명이라니, 꽤 많은 시간이네요!인덱스는 MySQL에 데이터에 대해 알려주는 방법입니다. "이 필드를 자주 볼 테니 각 값에 대한 레코드를 찾을 수 있는 위치 목록을 보관하십시오."

일반적으로 인덱스는 정기적으로 쿼리되는 필드에 적합합니다.인덱스를 정의할 때 유일한 단점은 추가 스토리지 공간을 사용한다는 것입니다. 따라서 공간이 부족하지 않다면 인덱스를 사용해 보는 것이 좋습니다.해당되지 않으면 MySQL은 무시합니다.

선택한 쿼리 시간을 개선하기 위해 인덱싱의 중요성에 동의하지 않지만 다른 키로 인덱싱할 수 있고 이러한 인덱스로 쿼리를 작성할 수 있다면 타임스탬프를 인덱싱할 필요가 없을 수 있습니다.

를 들어,이 있다, 테이블이 , 라고 합시다.timestamp,category , , , , 입니다.userIduserId타임스탬프를 .사용자가 많은 테이블에서는 타임스탬프를 검색하는 나머지 세트가 상당히 줄어듭니다.

...또한 이 방법의 장점은 삽입률이 높고 고유한 타임스탬프가 있는 테이블에서 각 삽입마다 타임스탬프 인덱스를 작성하는 오버헤드를 피할 수 있다는 것입니다.

타임스탬프나 다른 키를 기반으로 인덱스를 작성하는 것과 같은 문제로 어려움을 겪고 있습니다.나는 아직 검사가 남아서 내가 여기서 말하는 것의 뒤에 증거를 넣을 수 있다.결과에 따라 포스트백을 시도하겠습니다.

더 나은 설명을 위한 시나리오:

  1. 타임스탬프 99% 고유
  2. userId 80% 고유
  3. 카테고리 25% 고유

    • 타임스탬프에 인덱스를 붙이면 쿼리 결과가 테이블 크기의 1%로 빠르게 감소합니다.
    • userId로 인덱싱하면 쿼리 결과가 테이블 크기의 20%로 빠르게 감소합니다.
    • 카테고리에 인덱스를 붙이면 쿼리 결과가 테이블 크기의 75%로 빠르게 감소합니다.
    • 타임스탬프에 인덱스를 삽입하면 오버헤드가 높아집니다**
    • 삽입 시 타임스탬프가 증가하고 있다는 사실을 알고 있지만 증분 키에 기반한 MySQL 최적화에 대한 논의는 없습니다.
    • userId에 인덱스를 삽입하면 오버헤드가 상당히 높아집니다.
    • 카테고리에 인덱스를 삽입하면 오버헤드가 상당히 낮아집니다.

** 죄송합니다. 산출된 오버헤드나 인덱스에 의한 삽입을 알 수 없습니다.

쿼리에서 주로 이 타임스탬프를 사용하는 경우 이 설계를 테스트할 수 있습니다(첫 번째 부분으로 타임스탬프를 사용하여 기본 키를 확장).

CREATE TABLE perf (
  , ts INT NOT NULL
  , oldPK 
  , ... other columns 
, PRIMARY KEY(ts, oldPK)
, UNIQUE (oldPK)
) ENGINE=InnoDB ;

이렇게 하면 게시한 것과 같은 쿼리가 클러스터된(기본) 키를 사용하게 됩니다.

단점은 삽입 속도가 다소 느리다는 것입니다.또한 테이블에 다른 인덱스가 있는 경우 4바이트 더 넓은 기본 키가 포함되므로 조금 더 많은 공간을 사용합니다.

이러한 클러스터화된 인덱스의 가장 큰 장점은 테이블 또는 테이블 전체를 읽어야 하는 쿼리 등 광범위한 스캔을 사용하는 쿼리가 관련 행을 원하는 순서대로 순차적으로 찾을 수 있다는 것입니다.BY timestamp일별, 주별, 월별, 년별로 그룹화하는 경우에도 편리합니다.

이전 PK를 사용하여 다음 데이터를 유지함으로써 행을 식별할 수 있습니다.UNIQUE구속할 수 있습니다.


또한 여러 클러스터된 인덱스를 허용하는 MySQL(및 오픈 소스) 변형인 TokuDB도 살펴볼 수 있습니다.

언급URL : https://stackoverflow.com/questions/9087767/creating-an-index-on-a-timestamp-to-optimize-query

반응형