본문 바로가기
관리자

Programming-[Backend]/Database

(15)
[TIL] MySQL 사용 관련 주요 팁 모음: 타입, INET_ATON, FK 물리적으로 걸지 않기 MySQL은 json 필드값들 가상 컬럼으로 잡아주나, 성능이 떨어짐 숫자 타입: unsigned 옵션 줘서 음수 사용 안하게 해서 공간 활용도 높이기 문자열 타입: text 타입은 테이블 바깥 공간에 따로 저장된다(mySQL)postgreSQL의 경우 긴 VARCHAR 타입보다 TEXT 타입이 외부 공간에 저장됨에도 불구하고 속도가 빠르다 TIMESTAMP는 유닉스 epoch라서 2038년 까지만 사용가능(4바이트) MySQL의 INET_ATON 함수: IPv4 주소를 4바이트로 줄여서 저장해줘서 공간 절약하며, 검증도 해줌 Stored Procedure: SQL 쿼리문 등을 DB에 저장해놓는 것. MSSQL, Oracle 실디비 같은건 성능이 좋아서 괜찮은데 MySQL의 경우에는 성능 이슈가 있어서 ..
[경험 요약] Atomikos multi-database transaction 묶기 https://wildeveloperetrain.tistory.com/332 Atomikos를 통한 Multi Datasource Transaction 처리 (전역 트랜잭션)스프링 부트 다중 데이터베이스 트랜잭션 처리 (jta-atomikos) 해당 포스팅은 스프링부트 환경에서 다중 데이터베이스를 연결할 때 'multi datasource에 대한 트랜잭션 처리'에 대해 정리한 내용입니다.wildeveloperetrain.tistory.com 위 링크가 정리가 잘 된 것 같다. 실무를 해보면서 유의해야할 점들을 저장해놓는다. 1. application.yml에서 hibernate 설정이 잘 안될 수 있다.- 따로 Datasource config를 위한 Bean들을 만들어서 Config에서 설정 내용을 주입..
[TIL][link] DB Connection Pooling, context manager DB Connection Pool은 여러 클라이언트의 DB 접속 요청을 위해 미리 세션을 만들어놓고 배분하는 것을 뜻한다. 이렇게 미리 만들어 놓지 않으면 DB는 접속 요청이 올 때마다 세션을 생성하는 작업을 반복해야해서 성능에 좋지 않다. 참조 링크 글에서는 connection pool을 설정하지 않거나 설정하고 DB에 연결 요청을 했을 때 소요 시간을 비교한다. SQLAlchemy를 사용하였으며, 아래 코드에서 poolclass=QueuePool 부분이 ConnectionPool 설정을 해주는 부분이다. from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from sqlalchemy.pool import QueueP..
[TIL] DB pagination offset 문제, covering index 문제점 pagination을 하기 위해서 보통 아래와 같은 형식의 쿼리문을 사용한다. select ... from ... where ... limit ... offset limit은 가져올 데이터의 총 개수를, offset은 데이터를 조회할 시작점을 의미한다. 여기서 문제는, 데이터 개수가 많아지면(offset 100만건 이상?) offset 위치를 찾는 것을 마치 연결 리스트처럼 처음부터 쭉 이어나가다가 DB에 부하가 크게 걸릴 수 있다. 해결방법 where절에 조건을 건다. 특정값 이상의 id를 갖는 row만 조회한다던가, 날짜-연도 등을 기준으로 특정일 이후부터만 조회하도록하여 데이터의 개수 자체를 줄여서offset에 드는 부하를 줄여준다. covering index를 갖는 subquery를 실행하..
[TIL] insert시 ForeignKey에 제한 걸기: DB Trigger 사용 Django - python - postgresql을 이용하여 작업을 진행하던 중, 발생했던 문제점을 해결한 기록이다. 문제상황 아래처럼 새로운 테이블(모델)을 생성하고자 했다. class IWantNewModel: old_model = ForeignKey( "models.OldModel", on_delete=CASCADE, ... ) 이 때, FK가 되는 old_model의 타입을 특정 타입이 되도록 제한하고 싶었다. DB 자체에서 제한을 걸면 나중에 서비스단 로직에서 굳이 validation을 복잡하게 할 필요가 없기 때문이다. 한층 더 추상화되는 점은 있다만, 그래도 편리할 수 있다. Django에서는 이런 경우(FK가 아닌 경우에는) CheckConstraint 조건을 주어서 DB에서 제한을 걸도..
[TIL] 😎 MYSQL 필드 최대 길이 정의 varchar 255 vs 191 varchar 255 이유 MYSQL에서 필드의 최대 길이를 정의할 때 varchar(255)로 지정하는게 일반적이였다. 이것은 참조 링크에 따르면 MYSQL에서 메모리 용량을 8비트(256)에 맞추고 오래된 database와 호환하기 위해서 등이였다고 한다. 그리고 MYSQL에서 varchar로 된 필드를 indexing하기 위한 최대 용량을 767 byte로 잡아놨었다. 이것은 utf-8 기준이였고 767/3 = 255.666...이 되기 때문에 varchar 255로 정의하는게 관례였다. 3으로 나누는 이유는 utf-8 기준으로 모든 글자들이 3바이트에 포함되었기 때문이었다. varchar 191 이유 그러다가 이모지 🚀까지 포함하는 utf8mb4 collation 규칙이 적용되면서 한 글자에 4바..
[TIL] 여러 where 조건 한번에 조회하기. multi column related id query join 상황 base_table에 a, b컬럼이 FK로 잡혀있고, 중복된 항을 count로 구한 결과가 아래와 같을 때 다시 base_table에서 a_id, b_id를 갖는 id 값을 조회할려면 어떻게 해야할까? 다시 말해 (a_id, b_id) = (9002, 3145), ...인 Row들의 각 id 값을 구하고 싶은 경우 어떻게 해야할까 해결 방법 with 구문(또는 서브쿼리)로 원래 SQL문을 감싸고, 기존 테이블과 join을 하되 on절에 원하는 조건을 기입하면 된다. with tmp as (select count(id), a_id, b_id from base_table bt where 1 = 1 and deleted is null group by a_id, b_id having count(id) > ..
[Oracle] Oracle Xe 다운로드 및 설치, 기본 계정 설정, sql plus, IntelliJ 연결하기(IO Error : The Network Adaptor ...) 1. Oracle 데이터베이스 Oracle은 여러 종류의 관계형 데이터베이스 관리 시스템(RDBMS) 중 하나이다. 구매 및 유지 보수 비용이 크지만 그만큼 확실한 안정성과 유지보수를 보장받을 수 있기 때문에 대기업이나 공공기관에서 많이 사용한다. 데이터베이스 관리 시스템(DBMS)들은 SQL 표준을 준수하기 때문에 어떤 DBMS 사용하더라도 큰 문제는 없으나, DBMS 별로 기능이나 문법이 조금씩 달라서 가장 널리 쓰이는 Oracle DBMS를 사용하는 것이 처음 학습에 좋다. Oracle XE 버전 개요 Oracle XE(Oracle Express Edition) 버전은 공개 소프트웨어로 4GB의 메모리와 4GB의 데이터 파일까지 무료로 사용할 수 있다. 2. 다운로드 및 설치 아래 링크에 들어가서 ..