InnoDB에서 쿼리 분할해 성능 개선하기
·
프로그래밍
서론이전에 ETL 작업을 하면서 대량의 데이터를 조회할 때 다음과 같은 단일 쿼리를 사용한 적이 있다.SELECT *FROM AINNER JOIN B ON A.b_id = B.idINNER JOIN C ON A.c_id = C.idWHERE A.updated_at = '2025-01-01';이 쿼리로 한번에 모든 데이터를 가져오려고 했는데 A 테이블이 데이터 양이 많고 실제로는 조인문도 10개가 넘어서 실행시간이 몇분이 걸렸다. 이를 해결하기 위해 쿼리를 두 단계로 분리하는 방식을 사용했다. 먼저 조건에 맞는 id만 조회한 후, 그 id 목록을 이용해 실제 데이터를 가져오는 방식이다.# 첫번째 쿼리 SELECT idFROM AWHERE updated_at = '2025-01-01';# 두번째 쿼리 SEL..
Kafka 파티션 개수 동적으로 가져오기
·
프로그래밍
Kafka를 사용하다 보면 특정 토픽의 파티션 개수에 의존하여 로직을 설계하는 경우가 있다. 예를 들어, 특정 이벤트를 사용자 ID로 나누어 모듈로 연산 후 적절한 파티션에 메시지를 전송하는 로직이 있다. partition_count = 3 # 하드코딩된 파티션 개수partition = user_id % partition_count이 코드는 단순하고 명확하지만, 운영 중에 Kafka 토픽의 파티션 개수가 변경되면 문제가 발생할 수 있다. 새로운 파티션이 추가되더라도, 애플리케이션이 이를 반영하지 못해 메시지가 올바르게 분배되지 않을 위험이 있어 동적으로 파티션 개수를 가져오는 방법이 필요하다.Kafka 클라이언트 라이브러리의 AdminClient를 사용하면, Kafka 클러스터에서 메타데이터를 조회하여..
파이썬 가비지 컬렉터
·
프로그래밍
가비지 컬렉터(garbage collector)는 메모리 관리 방법 중 하나로, 사용자가 동적으로 할당하는 영역인 힙 메모리 영역 중 쓰이지 않는 영역을 자동으로 찾아내 해제하는 기능이다. 프로그래밍 초기에는 메모리 할당과 해제를 개발자가 직접 관리해야 했는데 이는 매우 번거롭고 오류가 발생하기 쉬운 작업이었다. 잘못된 메모리 해제나 중복 해제는 프로그램의 비정상 종료를 유발하고 메모리 누수(memory leak)같은 문제를 일으켰다. 이러한 문제를 해결하기 위해, 런타임에서 필요 없는 객체들을 자동으로 감지하고 해제하는 가비지 컬렉터가 도입되었다.예를들어, C에서는 malloc, calloc, free 같은 명령어로 메모리를 직접 관리하지만, JAVA나 Python 같은 언어는 가비지 컬렉터가 자동으로..
print vs logging
·
프로그래밍
보통의 코드 작업에는 에러 발생시 트래킹하기 위한 로그가 필요하다. kafka 작업을 하면서 작업 중간중간 로그와 에러발생시 어떤 팟의 어떤 토픽인지 남기는 과정을 print 문으로 진행했다. 그런데 pod log를 살펴보니 timestamp가 꼬이고, 어느정도 메세지가 쌓이지 않으면 print 문이 출력이 되지 않는 현상이 발생했다. 이는 print 문이 버퍼링이 있기 때문인데 버퍼가 차거나 flush 되기 전까지 출력이 실시간으로 나타나지 않는다. kafka 작업의 특성상 실시간으로 매우 빠르게 메세지들이 소비되는데 이렇게 느린 print문으로는 트래킹이 원활하게 되지 않았다. 해결첫시도처음에는 flush를 활성화하여 해결했다고 생각했지만, 출력이 꼬이는 문제는 해결되지 않았다. print문을 전송해..
빅쿼리 와일드카드(*) 사용
·
프로그래밍
빅쿼리의 이벤트 로그 테이블은 아래와 같이 테이블 이름뒤에 년월일이 붙어서 매일 새로 생긴다. table-name.event_20230710table-name.event_20230711원하는 일자의 모든 테이블을 검색하고 싶다면 와일드카드와 테이블 서픽스를 사용해서 검색해야 한다. 년월일 부분에 와일드카드를 붙이고 where 절에 _table_suffix 원하는 날짜를 적으면 해당 날짜의 모든 테이블을 검색 할 수 있다. FROM `table-name.events_*` where _table_suffix between '20230101' and '20230331'아래 코드는 2023 1월부터 3월까지의 방문한 유저의 수 요청이 와서 와일드 카드를 적용해 짰던 쿼리이다. SELECT event_date, ..
copy-on-write & defensive copy(함수형 프로그래밍)
·
프로그래밍
작업을 하면서 새롭게 알게된 copy-on-write(겸 함수형 프로그래밍) 정리. 함수형 프로그래밍 책 참고하여 작성.  함수형 프로그래밍이란부수 효과 없이 순수 함수만 사용하는 프로그래밍. 부수효과는 발생할 수 밖에 없기 때문에 함수형 프로그래밍을 통해 잘 다루도록 해야한다.부수효과 - 함수가 리턴값 이외에 하는 모든 행동.순수 함수 - 인자에만 의존하고 부수 효과가 없는 함수로 같은 인자를 넣으면 항상 같은 결과를 돌려주는 함수.액션, 계산, 데이터함수형 프로그래머는 코드를 액션, 계산, 데이터로 나눈다. 액션 외부에 영향을 주거나 받는 것이 액션 함수, 액션은 호출하는 시점과 횟수에 의존하기 때문에 호출 할 때 조심해야 한다.액션을 잘 사용하려면 가능한 액션을 적게 사용하고 액션 대신 계산을 사용..
[Python] map, filter, reduce 함수
·
프로그래밍
함수형 프로그래밍시 자주 사용하는 함수형 도구 map(), filter(), reduce()반복문을 대체해서 코드의 목적을 더 명확하게 할 수 있다. map(function, iterable)첫번째 인자로는 적용할 함수, 두번째 인자로는 반복 가능한 자료형을 받음.배열의 모든 항목에 함수를 적용해 map 객체로 반환.(리스트나 튜플로 형변환 해줘야 함) 사용예제filter(function, iterable)첫번째 인자로는 적용할 함수, 두번째 인자로는 반복 가능한 자료형을 받음.배열의 특정 항목을 선택해 filter 객체로 반환. 사용예제reduce(function, iterable, initializer)첫번째 인자로는 적용할 함수, 두번째 인자로는 반복 가능한 자료형, 세번째 인자로 초기값을 받음.초..
MYSQL & PostgreSQL JSON 데이터
·
프로그래밍
업무 특성상 유저들의 다양한 정보를 전부 컬럼으로만 정의 할 순 없어서 JSON 형식을 많이 사용한다. 원하는 정보를 조회하려면 JSON parsing이 필수이다. 현재 mysql과 postgresql을 주로 사용하는데 둘의 파싱 문법이 달라서 간단하게 정리용.JSON 간단 정리더보기json 객체 { String key : String value }객체는 쉼표로 구분되고 키-값 형식의 쌍 포함json 배열[value1, value2, ...]쉼표로 구분되며 인덱스로 접근가능특징JSON 배열 요소 및 JSON 객체 키 값 내에서 중첩이 허용된다.key값이나 문자열은 항상 쌍따옴표를 이용하여 표기해야한다.JSON 값은 대소문자 비교가 가능하며 null, true, false 값은 항상 소문자로 작성되어야 한..