Database | ORM (20) 썸네일형 리스트형 [DB] 데이터 스캔방식과 인덱스 - MySQL 예제 백엔드 개발을 하다보면 성능에 대해서 고민을 하게된다. 대표적으로 비즈니스 로직의 시간복잡도, 외부 서비스들과의 통신, 그리고 DB 쿼리의 성능 등이 있을 것이다. 오늘 이 글에서는 DB 쿼리의 성능 최적화, SQL 튜닝의 대표적인 방법인 인덱스에 대해서 정리해 보려고 한다. ORM 을 많이 사용하다보니 기반이 되는 SQL 과 그 최적화에 대해서 소홀했던 부분이 있어서 기존에 알고있던 인덱스에 대한 정보들을 정리해서 작성해보고자 한다.1. 인덱스인덱스는 이름 그대로 원하는 데이터를 빠르게 찾기 위한 자료구조이다. 인덱스로 설정한 데이터들을 실제 데이터와 따로 보관 및 관리하여 테이블 전체를 스캔하지 않고도 데이터를 찾을 수 있도록 한다. 기본적으로 B-tree 구조로 구성되어 있으며, leaf node .. [MySQL] EXPLAIN 최근에 통계 관련 기능을 개발하기 위해 쿼리의 성능을 확인해가며 개발을 진행했다. 이때는 ORM 을 사용했기 때문에 프레임워크의 로깅 기능을 통해서 ORM 으로 작성한 쿼리에서 실제 발생하는 SQL 쿼리를 확인하면서 개발을 했다. 이번에는 한번 더 나아가서 SQL 쿼리가 실제 DB 에서 수행될 때 어떻게 수행되는지를 확인해보고자 한다. SQL 의 실행계획을 보기 위해서는 EXPLAIN 명령어를 사용하면 된다. 이 글에서는 EXPLAIN 에 대해서 설명하고 EXPLAIN 사용 방법과 결과를 해석하는 방법 등에 대해서 정리한다.1. EXPLAINEXPLAIN 은 MySQL 에서 쿼리를 실제 실행하기 전 MySQL 이 어떤 방식으로 작업을 실행할지 보여주는 도구이다. 쿼리의 성능 최적화를 위해서 많이 사용되며.. [PostgreSQL] DB 백업 - pg_dump 업무를 하던 중, PostgreSQL DB를 직접 파일로 백업해야할 필요가 있었다. 직접 DB의 데이터 디렉토리를 압축할 수도 있고 AWS와 같은 플랫폼 서비스를 사용한다면 스냅샷을 찍는 방법으로 백업을 할 수 있을 것이다. 이번 경우에는 런타임중에 실행중인 온프레미스 DB 서버의 데이터를 백업이 필요했고 이와 관련하여 찾아보던 중 pg_dump 유틸을 발견했다. 이 글에서는 pg_dump를 사용하여 백업하는 방법을 정리해본다.1. pg_dumppg_dump는 PostgreSQL 백업을 위한 유틸리티이다. 명령어를 통해 PostgreSQL database 를 스크립트 파일이나 아카이브 파일 형식으로 덤프하여 백업할 수 있다. - 스크립트 형식: DB를 백업 당시의 상태로 재구성하기 위한 SQL문이 포함된.. [JPA] LazyInitializationException 과 OSIV 테스트 코드를 작성하다가 LazyInitializationException 에러가 발생하였다. 이슈에 대해서 찾아보니 JPA 의 lazy loading 과 관련된 이슈였으며, @Transactional 등을 사용하여 해결할 수 있었다. 오늘은 해당 이슈가 발생하고 이를 해결하면서 가졌던 의문점과 이에 대한 설명을 정리해본다. 1. LazyInitializationException 에러 설명 및 발생 원인 org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.msa.dataset.domain.entity.Project.categories: could not initialize proxy .. [SQLAlchemy] imperative mapping SQLAlchemy 의 ORM 기능을 사용하기 위해서는 DB 의 테이블과 애플리케이션의 클래스를 매핑해야 한다. SQLAlchemy 에서는 테이블과 클래스를 매핑하는 방법으로 두가지 방법을 제공해준다. 하나는 Declarative Mapping, 다른 하나는 Imperative Mapping 이다. Declarative Mapping 은 클래스를 구현할 때 SQLAlchemy 의 DeclarativeBase 를 상속받음으로 명시적으로 ORM 에 의해 매핑될 클래스로 선언하는 방법이다. 반면에 Imperative Mapping 은 일반 클래스를 SQLAlchemy 의 Table 객체를 registry 에 매핑하여 등록함으로써 해당 클래스와 테이블을 매핑시켜주는 방식이다. 프로그램을 구현하면서 파이썬 클래스.. [SQLAlchemy] Relationship - CASCADE SQLAlchemy 를 사용하면 여러 테이블간의 relationship 을 생성하여 운영할 수 있다. 테이블들의 relationship 다루어 운영을 하다보면 하나의 테이블에 대한 동작이 다른 테이블에 영향을 주는 경우가 발생한다. 이러한 경우 DB 를 다루기 위해 복잡하고 반복적인 작업이 필요할 수 있다. SQLAlchemy 에서는 관계가 맺어진 객체들간의 작업을 간편하고 자동화하기 위한 "relationship cascade" 라는 기능을 제공한다. 이 기능을 사용하면 relationship 을 가진 테이블간에 어떻게 동작할 것인지, 어떻게 영향을 끼칠 것인지를 정의할 수 있다. 1. Cascade 란? Cascade 는 SQLAlchemy ORM 기능으로 객체들간의 관계를 정의할 때 사용할 수 있는.. [SQLite] SQLite 설명 및 예제 프로젝트를 진행하면서 DB 를 사용해야 하는 상황이 발생했다. 프로젝트의 프로토타이핑 과정이었기 때문에 다양한 기능과 성능보다는 간단한 설정과 빠르게 적용할 수 있는 DB 가 필요했고 SQLite 를 사용하기로 했다. SQLite 는 File DB 로 가볍고 따로 DB 서버를 설정할 필요가 없고 간편하게 사용할 수 있다. 이 글에서는 SQLite 에 대한 소개와 간단한 사용 방법을 정리하려고 한다. 1. SQLite 란? SQLite 는 가볍고, 빠르며, 독립적인 SQL Database 엔진을 구현하는 C 언어 라이브러리이다.SQLite 는 내장형 SQL DB 엔진으로 MySQL 이나 PostgreSQL 과 같은 기존의 RDBMS 와 달리 서버리스이며 실행을 위해 별도의 설치나 설정이 필요하지 않다. 대.. [MongoDB] Aggregation MongoDB 를 사용하여 쿼리를 하던 중에 쿼리 최적화를 위해서 관련있는 여러 컬렉션간의 조인에 대한 필요성이 발생했다. 그런데 MongoDB 는 NoSQL 데이터베이스이기 때문에 RDB 와 다르게 테이블 개념이 아니고 FK 등을 통해 테이블 간의 관계가 정의되어 있지 않아서 어떻게 조인을 하는지 검색해보았다. 검색 중에 MongoDB 문서에서 Aggregation 에 대한 정보를 찾았고 오늘은 이에 대해서 정리해보려 한다.1. AggregationAggregation 은 여러 document 들을 연산하여 나온 결과물을 반환하는 연산이다. RDB 에서 조인을 통해 여러 테이블의 데이터를 합쳐서 반환하는 것처럼 aggregation 도 여러 document 의 값들을 조건에 맞게 묶어서 그룹화한 결과를.. 이전 1 2 3 다음