개발/MySQL

· DEV/Backend
조회 Vs Join 무엇이 더 효율적인가 🐥 카카오테크캠퍼스 - 2단계 1주차 과제 분석을 하고 있는데, 자연스럽게 조회와 Join 중 무엇이 효율적인가 고민하게 되었습니다 사실 그냥 만드는거라면, 쓱쓱 만들면 되는데 그런게 아니라 대용량 처리나 잦은 조회 등의 문제도 생각해보고 싶었습니다 일단 조회(DB Lookup)와 조인 연산은 관계형 데이터베이스에서 수행하는 일반적인 작업입니다. 둘 다 데이터베이스로부터 정보를 검색하는 방법이지만, 특정 시나리오에 따라 성능에 다른 영향을 미칠 수 있습니다. 1. 데이터베이스 조회 (DB Lookup) DB Lookup은 특정 데이터를 찾기 위해 데이터베이스의 단일 테이블을 쿼리하는 것을 포함합니다. 예를 들어, Customers 테이블이 있고, ID로 고객의 세..
· DEV/Backend
낙관적 Lock과 비관적 Lock 낙관적 잠금 낙관적 잠금은 충돌이 드물고 전체 트랜잭션 중에 리소스를 잠글 필요가 없다고 가정하는 전략입니다. 대신 트랜잭션이 커밋될 때 충돌을 확인합니다. 충돌이 감지되면(예: 다른 트랜잭션이 데이터를 수정함) 트랜잭션이 롤백되고 오류가 반환됩니다. 낙관적 잠금은 버전 번호를 사용하여 구현됩니다. 트랜잭션이 커밋되면 시스템은 데이터베이스의 현재 버전 번호가 읽은 버전 번호와 일치하는지 확인합니다. 일치하면 트랜잭션이 커밋되고 버전 번호가 증가합니다. 일치하지 않으면 충돌이 발생하고 트랜잭션이 롤백됩니다. 다음은 낙관적 잠금을 사용하는 방법의 예입니다. START TRANSACTION; SELECT version_number FROM table_name WHERE con..
· DEV/Backend
트랜잭션 격리레벨 트랜잭션(Transaction) 격리 수준은 한 트랜잭션에서 변경한 내용을 다른 트랜잭션에 표시하는 방법과 시기를 결정합니다. SQL에는 네 가지 트랜잭션 격리 수준이 있습니다. READ UNCOMMITTED 가장 낮은 격리 수준입니다. 이 수준에서 트랜잭션은 아직 커밋되지 않은 다른 트랜잭션에서 쓰고 있는 데이터를 읽을 수 있습니다( 이로 인해 불일치가 발생할 수 있습니다. READ COMMITTED 이것은 많은 데이터베이스 시스템의 기본 수준입니다. 이 수준을 사용하는 트랜잭션은 트랜잭션이 시작되기 전에 커밋된 데이터만 볼 수 있습니다. 이는 더티 읽기를 방지하지만 여전히 반복 불가능한 읽기 및 팬텀 읽기로 이어질 수 있습니다. REPEATABLE READ 이 수준은 읽은 데이터가 ..
· DEV/Backend
트랜잭션 트랜잭션은 하나 이상의 SQL 문을 포함하는 단일 논리적 작업 단위입니다. 트랜잭션은 데이터베이스 시스템에서 데이터 무결성과 일관성을 보장하는 데 사용됩니다. 동일한 데이터에 대한 여러 작업이 동시에 발생할 수 있는 다중 사용자 및 동시 데이터베이스 환경에서 매우 중요합니다. 예시로 아래의 SQL 문이 작동하는 것을 봅시다 홍길동이 김국밥에게 잔액을 +900을 줬지만 3번에서 실패가 발생했습니다 이 경우, 데이터의 정합성이 깨집니다. 위의 그림처럼, 홍길동은 900이 그대로 남았지만, 김국밥은 잔액이 900원이 더 생긴 상태로 쿼리가 종료 되었습니다 눈 먼 돈이 생겨버렸죠 이러한 문제 때문에 여러 SQL문을 마치 하나의 오퍼레이션으로 묶어야 하는 필요가 생겼습니다 ACID ACID로 참조되는 네..
· DEV/Backend
조회 최적화를 위한 인덱스 Intro. 왜 인덱스를 써야 할까? 우린 주로 데이터를 메모리와 디스크에 저장한다. 그 중에서도 일반적으로 데이터베이스의 저장된 데이터는 실제로 디스크에 저장 된다 모두가 알다시피 디스크는 메모리에 비해 느리지만, 영속성과 가격 측면에서 유리함을 가지고 있기 때문이다 우리가 고민해야 할 점은 결국 디스크에 데이터에 저장해야 하는데 어떻게 효율적으로 데이터를 읽고 쓰냐이다 디스크에 접근하는 방식에 따라서 크게 랜덤 I/O와 순차 I/O 2가지 방법으로 나뉩니다 순차 접근은 연속된 블록의 데이터를 가져오는 것이며, 랜덤 접근은 특정 위치에 있는 데이터를 가져오는 것입니다. 순차 접근은 데이터를 연속적으로 읽거나 쓰는 작업에서 효율적이지만, 랜덤 접근은 특정 위치의 데이터에 접근해..
· DEV/Backend
정규화 데이터베이스 설계는 어떤 데이터를 어떻게 저장할 것인가에 대한 결정하는 것입니다 그 중에서도 '정규화’와 '반정규화’는 데이터베이스의 효율성과 성능에 큰 영향을 미칩니다 정규화(Normalization) 정규화란 '중복을 최소화하는 것’입니다. 간단하게 말해서, 동일한 데이터를 여러 곳에 반복하여 저장하지 않는 원칙입니다. 이는 데이터베이스 내에서 데이터의 일관성을 유지하는 데 중요합니다. 예를 들어, 사용자의 주소 정보가 변경되었을 때 정규화된 데이터베이스에서는 해당 사용자의 주소 정보를 단 한 번만 변경하면 되지만, 중복이 허용된 데이터베이스에서는 모든 중복된 주소 정보를 찾아 변경해야 합니다. 하지만 이 방식은 트레이드 오프가 있습니다. 데이터를 읽을 때 항상 원본 데이터를 참조해야 하기 때..
· DEV/Backend
MySQL 아키텍처 일반적으로 MySQL 서버와 통신을 할 때는 위와 같은 그림으로 동작합니다 웹 서버에서는 MySQL 서버와 통신하기 위한 컴포넌트인 커넥터를 사용합니다 커넥터는 MySQL 서버와의 연결을 설정하고, 쿼리 및 다른 데이터베이스 작업을 수행하기 위한 인터페이스를 제공하죠 그 대표적인 예시로 JDBC가 있습니다 MySQL 서버 아키테처를 이해하기 위해서는 주요한 컴포넌트들을 알아야 합니다. 이는 MySQL 엔진, 스토리지 엔진, 운영체제, 그리고 디스크로 구성되어 있습니다. MySQL 엔진 MySQL 엔진은 쿼리 파서, 전처리기, 옵티마이저, 그리고 쿼리 실행기로 구성되어 있습니다. 쿼리 파서 쿼리 파서는 사용자로부터 입력 받은 SQL을 파싱하여 Syntax tree를 생성합니다 이 과정에..
berom
'개발/MySQL' 태그의 글 목록