일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 티스토리챌린지
- 스마트컨트렉트 예약어 함수이름 중복
- 컨트렉트 배포 자동화
- 계정추상화
- vue기초
- SBT표준
- multicall
- rust 기초
- git rebase
- 스마트 컨트렉트 함수이름 중복
- erc4337 contract
- Vue
- 러스트 기초 학습
- 러스트 기초
- erc4337
- ethers v6
- 러스트기초
- 오블완
- ethers typescript
- Vue.js
- 머신러닝기초
- 스마트컨트렉트 함수이름 중복 호출
- chainlink 설명
- 컨트렉트 동일한 함수이름 호출
- ethers type
- ambiguous function description
- ethers websocket
- Today
- Total
체인의정석
DB에서 인덱싱하는 법과 Sequalize에서 테이블 정의 시 index 넣는 방법 본문
1. 인덱싱 체크하기
먼저 인덱싱은 조건 절에 들어가는 칼럼들 위주로 넣었다. 인덱싱을 다중 키로 넣는 경우 여러개도 가능하지만 블로그들을 찾아보니 5개 정도가 적당하다고 한다.
나는 아래 블로그를 학습하고 나서 인덱스를 걸었는데 매우 잘 나와있는 포스팅이다.
[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. 특정한 로직없이 무분별하게 반복되는 데이터인 경우
해당 경우에는 인덱스가 의미가 없을 수도 있다. 따라서 정렬이 들어갔을 때 시간이 단축될 만한 상황에 인덱스를 걸어주어야 하며 인덱스가 걸린 요소의 종류 수가 많지 않을 경우에도 굳이 걸 필요가 없다.
'개발 > 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 |