일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 러스트기초
- 러스트 기초
- ethers
- multicall
- ethers type
- nest.js설명
- 체인의정석
- 컨트렉트 배포 자동화
- ethers typescript
- 프록시배포구조
- vue기초
- 머신러닝기초
- rust 기초
- Vue.js
- 러스트 기초 학습
- 스마트컨트렉트테스트
- git rebase
- 컨트렉트 동일한 함수이름 호출
- ethers v6
- 스마트컨트렉트 함수이름 중복 호출
- chainlink 설명
- 스마트컨트렉트프록시
- SBT표준
- ambiguous function description
- Vue
- ethers websocket
- 오블완
- 스마트 컨트렉트 함수이름 중복
- 스마트컨트렉트 예약어 함수이름 중복
- 티스토리챌린지
- Today
- Total
체인의정석
DB에서 인덱싱하는 법과 Sequalize에서 테이블 정의 시 index 넣는 방법 본문
1. 인덱싱 체크하기
먼저 인덱싱은 조건 절에 들어가는 칼럼들 위주로 넣었다. 인덱싱을 다중 키로 넣는 경우 여러개도 가능하지만 블로그들을 찾아보니 5개 정도가 적당하다고 한다.
나는 아래 블로그를 학습하고 나서 인덱스를 걸었는데 매우 잘 나와있는 포스팅이다.
인덱싱을 체크하고 싶은 경우 쿼리에서 explain을 걸 시 적용되는 인덱스를 확인 할 수 있다.
인덱스를 쿼리로 매번 넣어주는것도 가능하지만 시퀄라이즈 같은 모듈을 사용하는 경우라면 이를 테이블 생성 시 에 포함하여 생성되도록 만들 수 있다.
2. 시퀄라이즈에서 인덱싱하기
https://sequelize.org/docs/v6/other-topics/indexes/
https://dev.to/projectescape/the-comprehensive-sequelize-cheatsheet-3m1m#indexes
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
4. 특정한 로직없이 무분별하게 반복되는 데이터인 경우
해당 경우에는 인덱스가 의미가 없을 수도 있다. 따라서 정렬이 들어갔을 때 시간이 단축될 만한 상황에 인덱스를 걸어주어야 하며 인덱스가 걸린 요소의 종류 수가 많지 않을 경우에도 굳이 걸 필요가 없다.
'개발 > database' 카테고리의 다른 글
Nest.js & Cassandra 로 백엔드 세팅해보기 (0) | 2023.11.14 |
---|---|
카산드라 DB mac에서 사용해보기 (0) | 2023.11.13 |
Sequalize와 raw query를 통하여 updated at, created at 만들기 (0) | 2023.08.25 |
MYSQL에서 Insert와 update 하나의 구문으로 처리하기 (ON DUPLICATE KEY UPDATE, UPSERT, sequalize) (0) | 2023.08.21 |
MySQL) 쿼리 실행 순서 및 테이블 합치기 (0) | 2023.02.14 |