체인의정석

DB에서 인덱싱하는 법과 Sequalize에서 테이블 정의 시 index 넣는 방법 본문

개발/database

DB에서 인덱싱하는 법과 Sequalize에서 테이블 정의 시 index 넣는 방법

체인의정석 2023. 9. 15. 18:47
728x90
반응형

1.  인덱싱 체크하기

먼저 인덱싱은 조건 절에 들어가는 칼럼들 위주로 넣었다. 인덱싱을 다중 키로 넣는 경우 여러개도 가능하지만 블로그들을 찾아보니 5개 정도가 적당하다고 한다.

나는 아래 블로그를 학습하고 나서 인덱스를 걸었는데 매우 잘 나와있는 포스팅이다.

https://inpa.tistory.com/entry/MYSQL-%F0%9F%93%9A-%EC%9D%B8%EB%8D%B1%EC%8A%A4index-%ED%95%B5%EC%8B%AC-%EC%84%A4%EA%B3%84-%EC%82%AC%EC%9A%A9-%EB%AC%B8%EB%B2%95-%F0%9F%92%AF-%EC%B4%9D%EC%A0%95%EB%A6%AC

 

[MYSQL] 📚 인덱스(index) 핵심 설계 & 사용 문법 💯 총정리

인덱스의 개념 인덱스란 데이터의 저장(INSERT, UPDATE, DELETE) 의 성능을 희생하고 그 대신에 데이터의 읽기 속도를 높이는 테이블의 동작속도(조회)를 높여주는 자료구조이다. 쉽게 예를 들어보면

inpa.tistory.com

인덱싱을 체크하고 싶은 경우 쿼리에서 explain을 걸 시 적용되는 인덱스를 확인 할 수 있다.

인덱스를 쿼리로 매번 넣어주는것도 가능하지만 시퀄라이즈 같은 모듈을 사용하는 경우라면 이를 테이블 생성 시 에 포함하여 생성되도록 만들 수 있다.



2. 시퀄라이즈에서 인덱싱하기


https://sequelize.org/docs/v6/other-topics/indexes/

 

Indexes | Sequelize

Sequelize supports adding indexes to the model definition which will be created on sequelize.sync().

sequelize.org

https://dev.to/projectescape/the-comprehensive-sequelize-cheatsheet-3m1m#indexes

 

The Comprehensive Sequelize Cheatsheet

Sequelize is the most famous Node ORM and is quite feature-rich, but while using it I spend much of m...

dev.to

const User = sequelize.define('User', { /* attributes */ }, {
  indexes: [
    // Create a unique index on email
    {
      unique: true,
      fields: ['email']
    },

    // Creates a gin index on data with the jsonb_path_ops operator
    {
      fields: ['data'],
      using: 'gin',
      operator: 'jsonb_path_ops'
    },

    // By default index name will be [table]_[fields]
    // Creates a multi column partial index
    {
      name: 'public_by_author',
      fields: ['author', 'status'],
      where: {
        status: 'public'
      }
    },

    // A BTREE index with an ordered field
    {
      name: 'title_index',
      using: 'BTREE',
      fields: [
        'author',
        {
          name: 'title',
          collate: 'en_US',
          order: 'DESC',
          length: 5
        }
      ]
    }
  ]
});

sequalzie에서 다음과 같이 인덱싱을 걸 수 있다.

나는 위의 코드를 참고해서 아래와 같이 인덱싱을 걸었다.

인덱싱을 걸때 쿼리 문에 있는 조건절의 종류를 모두 파악한 후에 조건 절에 있는 값들을 가져와서 처리하였다.

인덱싱을 하면 Insert, Delete, Update 속도가 느려지지만 검색 속도가 빨라진다.

나는 현재 블록체인 데이터를 쌓는 속도보다 추후 쿼리의 속도가 더 빠르므로 모든 쿼리에 인덱싱을 다 걸어주는 방식으로 진행하였다.

    {
        indexes: [
            {   
                name: `${table_name}_a_b`,
                fields: ['a', 'b']
            },
            {
                name: `${table_name}_c_d`,
                fields: ['c', 'd']
            }
        ],
        freezeTableName: true,
    }

이런식으로 넣어주면 되는데 이름은 알아서 자동 생성이 된다. 다만 자동생성되는 경우 이름이 길게 되면 테이블 생성이 안될 수 있어서 나느 다음과 같이 정의를 해두었다.

참고로 freezeTableName을 안하면 테이블 이름이 기본적으로 복수형이 나오게 된다.

3. 인덱싱을 할 때 조건문에 계산식이 있다면 

아래 블로그와 같이 인덱스를 타도록 바꾸어 주어야 한다.

https://isstory83.tistory.com/131

 

인덱스를 타지 않는 쿼리

인덱스 컬럼 절을 변형한 경우- 수식이나 함수 등으로 인덱스 컬럼 절을 변형하였을 경우- 반드시 함수나 수식을 사용해야 하는 경우에는 인덱스 컬럼 부분에 적용하지 말고, 여기에 대입되는

isstory83.tistory.com

4. 특정한 로직없이 무분별하게 반복되는 데이터인 경우

해당 경우에는 인덱스가 의미가 없을 수도 있다. 따라서 정렬이 들어갔을 때 시간이 단축될 만한 상황에 인덱스를 걸어주어야 하며 인덱스가 걸린 요소의 종류 수가 많지 않을 경우에도 굳이 걸 필요가 없다.

728x90
반응형
Comments