• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

인덱스에 대하여

22.03.25 15:25 작성 조회수 260

0

제로초님 MYSQL에 PK말고 인덱스라는게 있던데,

둘의 차이가 PK에서 중복허용, null허용 해준게 index 인것 맞나요?

PK와 index를 둘다거는것도 가능한지 의미있는지 궁금합니다.

사용예로 유저 email과 같은 where에 자주 사용되는것(null일수도있음)에 index걸어주면 되는걸까요?

답변 1

답변을 작성해보세요.

1

index는 검색 속도 빠르게 하는 것입니다. 중복, null 이런 것과 관련 없습니다.

pk나 unique는 고유값이라서 자동으로 인덱스 걸려 있습니다.

검색할 때 자주 검색하는 조건들에 index 걸어주시면 됩니다. 다만 여러 개에 동시에 걸 수도 있고 index 순서도 중요합니다. 그리고 index를 거는게 성능상 안 좋은 경우도 있습니다.

노른자님의 프로필

노른자

질문자

2022.03.25

답변 감사합니다.

다만, index순서가 중요하다고 하셨는데 제가 이해한게 맞나 모르겠습니다.

 

한테이블에서 여러컬럼 인덱스 지정을 한다했을경우,

중복성이 낮은순 --> 높은순 으로 순서를 지정해야하고,

Typeorm에서 지정하는방법은

위 처럼 하면 순서대로 인덱스를 지정할수있는것인가요? (firstname, middlename, lastname순)

근데 인덱스 firstname, lastname은 중복되는데 뭔지모르겠네요...

 

이렇게 개별 컬럼에 인덱스를 하면 순서지정을 못할것같아서요.

 

제가 이해한게 맞나요??

네 복합 인덱스는 클래스 위에 다는 게 맞습니다. 다만 @Index간의 순서가 중요한 게 아니라

firstName, lastName이냐, lastName, firstName이냐 순서가 중요합니다.

firstName, lastName 인덱스인데 where lastName = 'cho' and firstName = 'zero'로 쿼리하면 인덱스 효과를 못봅니다.

노른자님의 프로필

노른자

질문자

2022.03.25

아 그럼 where firstname ='zero' and lastname ='cho' 이런식으로 where을 2개로 찾을떄

@Index(['firstname'.'lastname'])을 클레스 위에써주는거고.

 

where firstname = 'zero'이런식으로 하나만 사용하여 찾을때는

그냥 컬럼위에 @Index() 써주면된다는거군요.

 

@Index(['firstname','lastname']) 이렇게 해놓고 where firstname ='zero'   이나 where lastname ='cho' 이런식으로 하나만 사용한 where문은 효과를 못보는건가요??

 

@Index(['firstname'.'lastname']) 이렇게 하면 참고로 where firstName = 'zero'만 할 때도 저 인덱스가 사용됩니다. where lastName = 'cho'는 안 됩니다.

노른자님의 프로필

노른자

질문자

2022.03.25

감사합니다. 

그럼 혹시 개별 컬럼 @Index()시에는 where lastName = 'cho' and firstName = 'zero' 이것도 효과를 볼수있나요?? (마지막 질문)

볼 수 있습니다. lastName index 먼저 활용하고 그 다음 firstName 활용할 것 같네요.