목차
개요
카카오테크캠퍼스 백엔드 과정 주차 관련 공부내용
인덱싱을 하는이유?
데이터베이스에서 데이터를 빠르게 조회하기 위해서이다.
인덱스는 테이블의 특정 열에 대한 포인터 목록이며, 이 목록을 사용하여 데이터베이스는 특정 값을 가진 행을 효과적으로 찾을 수있기 때문이다.
결국 이 효과적으로 찾을수 있다는 건 데이터 탐색 범위를 최소화하여 검색 성능을 향상시키는 것이라고 볼수 있다.
인덱싱의 장점
속도 향상
- 인덱스를 사용하면 특정 행을 찾기 위해 테이블의 모든 행을 스캔할 필요가 없기 때문에 데이터 검색 속도가 향상된다.
쿼리 최적화
- 인덱스가 있으면 DBMS 시스템들은 대부분의 쿼리를 더 빠르게 처리할 수 있게 된다.
정렬된 데이터 접근
- 인덱스는 일반적으로 특정 열의 값에 따라 정렬되므로, 정렬된 데이터에 대한 쿼리를 더 빠르게 처리할 수 있다.
- 예를 들어, 데이터베이스에서 최신 날짜를 가진 행을 찾는 쿼리를 수행하는 경우, 날짜 열에 인덱스가 있다면 당연히 정렬을 한 행을 이용해서 쿼리를 빠르게 찾아낼수 있다.
데이터 무결성 보장
- 인덱스를 만들시에 유일성을 가지게 설계를 해서 특정 열의 값이 유일함을 보장하여 데이터 무결성을 보장할수 있게 된다.
인덱싱의 단점
원하는 동작이 도출되지 않을수 있다.
- 자신이 짠 SQL쿼리와 DBMS의 특성을 고려해서 원하는 결과를 얻을수 있게 하는 인덱싱 기법을 사용해야한다.
- 이 부분은 많은 실습이 따르는것 같다.
- 만일 오류가 생기거나 제대로 작동하지 않는다면 EXPLAIN 명령을 이용해 쿼리 계획을 사용하고 문제를 파악하는 것이 좋다.
인덱싱 DB도 결국엔 시간과 비용이 필요하다.
- 생성과 새로운 정보가 업데이트 된다면 그것의 일관성을 유지하거나 관리하는 데에도 시간과 서버 비용들이 들어간다.
- 따라서 이를 고려했을때도 인덱싱을 사용하는것이 유의미한 결과를 가져올때 사용을 하는것이 좋다.
인덱싱 알고리즘
데이터베이스 인덱싱에서 사용되는 주요 알고리즘 4가지.
1. Hash Map (해시 맵)
Python의 dict, JavaScript의 Object, Java의 HashMap
정의
해시 맵은 키-값 쌍을 저장하는 데이터 구조로, 키를 해시 함수에 전달하여 고유한 해시 값을 생성하고 해시 값은 배열의 인덱스로 사용되어 연관된 값을 저장하는 데 사용한다.
복잡도
검색, 삽입, 삭제
- 평균적으로 O(1)
- 최악의 경우 O(n), (해시 충돌이 발생한 경우)
특성
해시 충돌(두 개 이상의 키가 동일한 해시 값을 생성하는 경우)을 처리하는 복잡성이 있으며, 대량의 데이터에 대한 효율적인 범위 검색이 어렵다는 단점이 있습니다.
2. List (리스트)
Python의 list, JavaScript의 Array, Java의 LinkedList
정의
리스트 인덱싱은 특정 순서에 따라 데이터를 저장하는 가장 간단한 형태의 인덱싱으로 일반적으로 연결 리스트를 사용하며, 이는 각 데이터 요소가 다음 요소에 대한 포인터를 가지고 있는 구조
복잡도
검색: O(n)
삽입: O(1), 리스트의 끝에 삽입하는 경우 O(n), 리스트의 중간에 삽입하는 경우
삭제: O(1), 리스트의 끝에서 삭제하는 경우 O(n), 리스트의 중간에서 삭제하는 경우
특성
리스트 인덱싱은 단순하고 이해하기 쉽지만, 일반적으로 검색, 삽입, 삭제 연산에 대해 선형 시간 복잡성을 가진다. 따라서 큰 데이터 세트에는 비효율적일 수 있다.
3. Tree (트리)
Java의 TreeMap, C++의 set, Python의 bintrees
정의
트리 기반 인덱싱은 계층적 데이터 구조를 사용하여 데이터를 저장하고 검색한다. 예시로는이진 트리(Binary Tree), AVL 트리, B 트리 등이 대표적이다.
복잡도
검색, 삽입, 삭제: O(log n), 이진 검색 트리인 경우
특성
트리 인덱싱은 로그 시간 복잡성을 가지므로 큰 데이터 세트에 대해 효율적이지만 트리가 균형을 유지해야 하므로 삽입 및 삭제 작업이 복잡해질 수 있다.
4. B+Tree (B+트리)
관계형 데이터베이스 시스템(MySQL, PostgreSQL 등)에서 인덱싱에 사용된다.
정의
B+트리는 데이터베이스 및 파일 시스템에서 가장 일반적으로 사용되는 인덱싱 구조 중 하나로 B+트리는 B 트리의 확장으로, 모든 값은 리프 노드에만 저장되며, 내부 노드는 리프 노드로의 포인터만 저장하는 구조적 특징을 가진다.
이 구조는 범위 검색을 더 효율적으로 수행하게 해주며, 데이터베이스 디스크 I/O를 최적화한다. 또한 B+트리는 삽입, 삭제, 검색 작업 모두에 대해 로그 시간 복잡성을 가진다.
마무리
다음 포스팅에서는 멀티스레드 환경에서의 동시성에 대해서 알아보고 래퍼런스와 함께 S/X락, 의도락 그리고 락을 사용하지 않는 낙관적 락 방식에 대해서 알아보자
'미사용 > KakaoTechCampus' 카테고리의 다른 글
MySQL기초[4]- 동시성 유지를 위한 S/X 락 (0) | 2023.06.15 |
---|---|
MySQL기초[2]- 캐싱,버퍼풀 전략 (0) | 2023.06.14 |
MySQL기초[1]- 고전 3티어 구조 및 MySQL엔진 구성요소 (0) | 2023.06.14 |
Java기초[10] 인터페이스 기본개념으로 알아보는 다형성 (0) | 2023.04.28 |
Java기초[9] 전략&템플릿 메서드 패턴 (0) | 2023.04.28 |