🎯 스토리지 엔진 수준의 락 종류스토리지 엔진 락(Storage Engin Locks) 은 InnoDB, MyISAM 등 스토리지 엔진이 자체적으로 관리하는 락을 의미 합니다. 데이터 읽기, 쓰기, 트랜잭션 제어가 동작할때 적용되고 데이터 정합성과 동시성을 제어하기 위해 내부적으로 처리하는 락 메커니즘 입니다. 대부분의 경우 InnoDB 엔진을 사용하므로 해당 포스팅에서는 InnoDB 기준으로 설명드리겠습니다. MYSQL 서버는 SQL 쿼리를 파싱하고 실행 계획을 세우며, 스토리 엔진은 실제 데이터에 접근하고 락을 관리합니다. 즉, 스토리 엔진 락 == 데이터 자체에 대한 잠금을 의미합니다. 총 4 락이 존재합니다. 1. 레코드 락(Recor Lock)2. 갭 락 (Gap Lock)3.넥스트 키 락 ..
데이터베이스

🎯 LIKE 의 한계 일반적으로 특정 텍스트가 포함되어 있는지 여부를 확인할때 LIKE 연산을 사용합니다. %LIKE, %LIKE%, LIKE% 와 같이 접두사, 중간값, 접미사 형태로 검색 조건을 작성하죠. 그러나 이와 같은 LIKE 검색은 인덱스 활용 여부에 따라 성능이 크게 달라질 수 있습니다. ✅ 인덱스 사용 가능 여부 패턴예시 인덱스 사용 여부설명LIKE 'abc%'접두사 검색✅ 인덱스 사용함문자열이 왼쪽부터 일치하므로 B-Tree 인덱스 탐색 가능LIKE '%abc'접미사 검색❌ 인덱스 미사용앞이 %이면 인덱스 범위 탐색 불가 → 풀스캔LIKE '%abc%'중간 포함 검색❌ 인덱스 미사용문자열 전체를 확인해야 하므로 인덱스 탐색 불가LIKE '_bc%'와일드카드❌ 경우에 따라 다름첫 글자부..

🎯 커버링 인덱스란 ?커버링 인덱스(Covering Index) 란 쿼리를 처리할 때, 해당 인덱스로만 원하는 데이터를 모두 조회할 수 있어 데이터 영역(테이블)에 접근할 필요가 없는 인덱스를 말합니다. 즉, 테이블에 접근하지 않고 쿼리를 해결하기 때문에 조회 속도가 매우 빠른것이 특징입니다. 하지만, 쿼리에서 사용하는 모든 값들에 대한 인덱스를 만들면 너무 많은 값들이 인덱스에 포함될 수 있는 단점이 있습니다. 그렇기 때문에 실제로 커버링 인덱스에 태우는 부분은 select를 제외한 나머지 값들에 대해서만 인덱스를 만드는 것입니다. 예를 들어 다음과 같은 쿼리가 있다 가정해봅시다. SELECT *FROM homes ORDER BY id DESCOFFSET 페이지번호LIMIT 페이지사이즈 위 쿼리를 ..

🎯 기존 페이징 조회 문제와 No OffSet 을 통한 개선 방안먼저 일반적으로 사용하는 페이징 조회 쿼리 입니다. Home 게시물에 대한 페이징 조회와 home_id 에 DESC 를 걸어 최신순으로 가져옵니다. 기본적인 페이징 조회 쿼리SELECT *FROM homeWHERE 필터링조건ORDER BY home_id DESCOFFSET 페이지번호LIMIT 페이지사이즈 이러한 페이징 조회 쿼리는 데이터가 적은 100, 10000건 정도의 환경에서는 큰 문제없이 동작합니다. 하지만, 100000 건 이상의 많은 양의 데이터에 대한 페이징 조회는 다음과 같은 이유때문에 성능이 저하됩니다. 만약 페이지 번호(offset) 이 10000 이고, 페이지 사이즈(limit) 가 10 이면 총 10,010 개의 ..

🎯 인덱스(INDEX) 란 ?먼저 인덱스(Index) 의 개념에 대해 먼저 알아봅시다. 인덱스는 테이블의 데이터를 더 빠르게 조회하기 위해 사용하는 자료구조 입니다. 책에 있는 목차를 보고 원하는 내용에 더 빠르게 접근할 수 있는 개념과 비슷합니다. 이러한 인덱스를 효율적으로 잘 쓰기 위해서는 선택도에 대해 잘 판단해야 합니다. 즉, 중복되지 않는 값이 많을수록(=선택도가 높을 수록) 인덱스 효과가 좋습니다. 예를들어 주민번호와 이메일같은 값은 선택도가 높아 인덱스를 걸면 효율적으로 접근할 수 있습니다. 반대로 성별, 국가명 등 중복이 많은 값들은 선택도가 낮아 인덱스가 비 효율적입니다. 🎯 어떤 값을 인덱스할까? 현재 설계되어 있는 집 게시물을 나타내는 Home 엔티티에는 집 상태(Home Sta..

🎯 트랜잭션 격리 수준이란?트랜잭션 격리 수준(Transaction Isoliation Level) 은 데이터베이스에서 여러 트랜잭션이 동시에 실행될 때 데이터의 정합성과 일관성을 보장하기 위해 설정되는 수준 입니다. 즉, 트랜잭션 간에 어느정도까지의 범위를 허용하며 서로 작업할지를 나타내는 척도라고 할 수 있습니다. 트랜잭션 수준은 크게 4가지로 나뉩니다. READ UNCOMMITED -> READ COMMITED -> REPEATABLE READ -> SERIALIZABLE 순서로 격리 수준이 높아 집니다. 그러면 이렇게 격리 수준을 왜 나눌까에 대해 알아보기 전에 트랜잭션의 성질 부터 이해해야 합니다. 트랜잭션은 ACID 의 특징을 갖고 있습니다. ✅ 트랜잭션 ACID 1. Atomicity ..