전체 글 16

OFFSET은 느리다

대부분의 애플리케이션에서 페이징을 위해 SELECT ... ORDER BY ... LIMIT N OFFSET M 패턴을 사용합니다. 데이터가 수십만~수천만 건으로 커지거나 OFFSET이 커질수록 쿼리가 급격히 느려집니다. 왜 느려지는지, 언제 써도 되는지, 그리고 어떤 대안이 더 나은지(키셋/시크 페이징 등)를 예제와 함께 정리합니다.1. OFFSET/LIMIT가 느려지는 구조적 이유OFFSET은 “앞에서 M개를 건너뛴 뒤 N개를 반환”을 의미합니다. 대부분의 DB 엔진(PostgreSQL, MySQL/InnoDB 등)은 다음과 같은 비용을 지불합니다.스캔 건너뛰기 비용: OFFSET으로 건너뛰는 행도 실제로는 읽고(스캔하고) 버려야 합니다. OFFSET이 100,000이면 최소 100,000행을 스캔 ..

복합인덱스와 효율적인 쿼리

복합인덱스 (Composite Indexes)복합인덱스는 두 개 이상의 컬럼을 조합하여 생성하는 인덱스로, 다중 컬럼 인덱스(Multi-column Index)라고도 불립니다. 이 문서에서는 복합인덱스의 개념, 특징, 장단점 및 효과적인 사용 방법에 대해 설명합니다.복합인덱스의 개념복합인덱스는 여러 컬럼을 하나의 인덱스로 결합한 것으로, 인덱스 내에서 컬럼들의 순서가 중요한 의미를 갖습니다.특징두 개 이상의 컬럼으로 구성됨컬럼 순서에 따라 검색 효율성이 달라짐B-Tree, Hash, GiST 등 다양한 인덱스 유형으로 구현 가능인덱스 키의 일부분만 사용하는 검색도 가능 (왼쪽 접두사 규칙)복합인덱스 구조복합인덱스는 지정된 컬럼들의 값을 연결하여 정렬된 구조를 형성합니다. 예를 들어, (last_name,..

비트맵 인덱스 스캔 vs 인덱스 스캔 vs 테이블 스캔

데이터베이스 쿼리 실행 시 데이터를 검색하는 방법은 크게 세 가지로 나눌 수 있습니다: 비트맵 인덱스 스캔(Bitmap Index Scan), 인덱스 스캔(Index Scan), 그리고 테이블 스캔(Table Scan). 각 방식은 서로 다른 상황에서 최적의 성능을 제공합니다.테이블 스캔 (Table Scan / Sequential Scan)테이블 스캔은 가장 기본적인 데이터 접근 방식으로, 테이블의 모든 레코드를 처음부터 끝까지 순차적으로 읽는 방식입니다.특징테이블의 모든 행을 읽음인덱스를 사용하지 않음디스크에서 모든 데이터 블록을 순차적으로 읽음적합한 상황작은 테이블에서 데이터를 검색할 때테이블의 대부분의 행을 검색해야 할 때 (일반적으로 테이블의 10-15% 이상)적절한 인덱스가 없을 때장점구현이 ..

식별자와 비식별자 인덱싱, Index 스캔과 Index Only 스캔

데이터베이스에서 인덱스는 데이터 검색 성능을 향상시키는 핵심 요소입니다. 이 문서에서는 식별자 인덱싱과 비식별자 인덱싱의 차이점, 그리고 Index 스캔과 Index Only 스캔의 특징과 활용 방법에 대해 설명합니다.식별자 인덱싱 vs 비식별자 인덱싱식별자 인덱싱 (Identifier Indexing)식별자 인덱싱은 테이블의 기본 키(Primary Key) 또는 고유 식별자를 기반으로 생성된 인덱스를 의미합니다.특징테이블의 기본 키(PK) 또는 고유 식별자에 생성됨데이터의 고유성(Uniqueness)을 보장대부분의 DBMS에서 기본 키에 자동으로 생성클러스터형 인덱스(Clustered Index)로 구현되는 경우가 많음적합한 상황레코드의 고유 식별이 필요한 경우관계형 데이터베이스에서 테이블 간 관계 설..

테이블과 인덱스는 디스크에 어떻게 저장될까?

개요테이블과 인덱스가 디스크에 어떻게 저장되고, 쿼리가 어떻게 수행되는지를 이해하기 위한 핵심 개념 정리입니다.🧱 Table (테이블)테이블은 논리적인 데이터 구조로, 행(row)과 열(column)로 이루어져 있습니다.emp_idemp_nameemp_dobemp_salary2000Mayo30/5/2025$100,0003000Nez30/5/2025$200,0004000MJ5/2/1982$300,000🆔 Row_ID (행 식별자)각 행(row)은 내부적으로 시스템에서 관리되는 고유한 식별자(row_id) 를 가집니다.MySQL(InnoDB): row_id는 일반적으로 기본 키(primary key) 와 동일합니다. PostgreSQL: row_id(또는 tuple_id)라는 시스템 컬럼을 별도로 가집..

ACID 트랜잭션 정리

목차ACID란?Atomicity (원자성)Consistency (일관성)Isolation (격리성)Durability (지속성)트랜잭션의 상태와 제어 (BEGIN, COMMIT, ROLLBACK, SAVEPOINT)격리 수준(Isolation Levels)과 동시성 현상동시성 제어 기법: 락킹, MVCC, 낙관적/비관적 제어로그와 복구: WAL, 체크포인트, 크래시 복구모범 사례와 실무 팁ACID와 다른 개념 비교: CAP, BASE참고 SQL 예시1. ACID란?ACID는 데이터베이스 트랜잭션이 안전하게 수행되기 위한 네 가지 핵심 속성의 약자입니다.Atomicity: 트랜잭션은 전부 수행되거나(ALL) 전혀 수행되지 않아야 한다(NOTHING)Consistency: 트랜잭션 전후로 데이터는 모든 제약..

장마철 실내 습도 관리와 제습기 사용 요령

장마철에는 습도가 급격히 높아져 불쾌지수가 올라가고, 집안 곳곳에 곰팡이와 냄새가 생기기 쉽습니다. 특히 고양이와 같은 반려동물을 키우는 가정에서는 피부질환이나 진드기, 사료·화장실 위생까지 더 신경을 써야 합니다. 오늘은 장마철 적정 습도와 제습기 활용 방법을 정리해 봅니다. 적정 실내 습도는 몇 %일까? 장마철에는 외부 상대습도가 80~90%까지 올라가는 날이 많습니다. 실내 습도가 높아지면 각종 문제가 생깁니다.일반적으로 추천하는 실내 적정 습도는 아래와 같습니다. ✅ 일반 가정 : 40~60%✅ 곰팡이·진드기 예방 : 40~50%✅ 반려동물 있는 집 : 45~55% 습도가 60%를 넘으면 곰팡이가 번식하기 쉽고, 사료나 고양이 화장실 모래에도 냄새와 세균이 퍼집니다. 특히 고양이, 강아지의 피부..

생활팁 2025.06.28

갑자기 맥북 충전이 안 되고 전원이 켜지지 않는다면?

어느 날 갑자기 맥북의 전원이 켜지지 않고, 충전도 되지 않았습니다. MagSafe 충전기를 연결하니 주황색 불이 깜빡이기만 하고, 오랜 시간 두어도 충전은 되지 않더군요.결론부터 말씀드리면, 저는 결국 AS 센터에 방문하여 로직보드와 배터리를 모두 교체해야 했습니다. 애플케어플러스에 가입하지 않은 상태라 수리비가 걱정이었지만,다행히도 구매한 지 1년이 지나지 않아 로직보드는 무상 교체를 받았고,배터리 교체 비용으로 44만 5천 원을 지불했습니다. 참고로 제 맥북은 2023년형 M2 Pro 16인치 모델입니다. 저와 비슷한 상황이라면 결국 AS를 맡기게 될 가능성이 높지만,그렇지 않다면 아래의 방법들을 먼저 시도해보시기 바랍니다. 1. 기본 점검 사항충전기 및 케이블 확인 : 비정품 또는 손상된 케이블..

생활팁 2025.06.25

Element 너비 꽉 채우게 폰트 사이즈 조절하기

https://kim-hyunjin.github.io/interactive-web-practice/resize-paragraph/ resize textarea kim-hyunjin.github.io 명세서 [시나리오] 영수는 앱을 켜고 거래 중인 잡코인의 금액을 살펴봅니다. 잡코인이라 금액이 들쑥날쑥하네요. 금액이 보이는 카드 UI의 사이즈는 50px정도로 코딱지만해서 소수점으로 긴 텍스트가 카드 안에 다 담기질 않네요. 이런, 잡코인이라도 얼마인지는 알려줘야 할 거 아니니! 돈과 관련된 정보라 조그마한 카드 안에서라도 어떻게든 긴 금액 텍스트가 다 보이도록 하고 싶습니다. 여기선 텍스트가 길어지면 텍스트의 사이즈를 줄여서라도 고객인 영수씨가 금액을 알 수 있도록 하고자 합니다.(가독성은 차치하고서라도요..

카테고리 없음 2023.07.21

swiper 양쪽 끝에서 spring 효과 구현하기

https://kim-hyunjin.github.io/interactive-web-practice/swiper-spring-effect/ 개발자 도구를 열어 모바일 화면에서 새로고침 후 테스트해보세요. swiper with spring effect kim-hyunjin.github.io [구현사항] 1. 모바일 화면에서 터치 이벤트로 동작하는 가로 스크롤 기능을 구현한다. 2. 터치를 왼쪽에서 오른쪽으로 하면, 왼쪽 컨텐츠가 보인다. 3. 터치를 오른쪽에서 왼쪽으로 하면, 오른쪽 컨텐츠가 보인다. 4. 왼쪽으로 더 이상 이동할 수 없을 경우(첫번째 컨텐츠가 화면상에서 가장 왼쪽에 위치) spring 효과를 적용한다. - 컨텐츠가 어느 임계점까지 왼쪽으로 더 이동했다가, 손가락을 놓으면 원위치 5. 오른쪽..

카테고리 없음 2023.07.19