CS 공부 8일차. 2021년 마지막은 Index와 ORM에 대해 공부하며 보냈습니다.
인덱스 : 특정 칼럼과 인덱스를 따로 테이블로 분리하여 더 검색하기 쉽게 하는 구조입니다. 보통 B+Tree를 사용하며 검색에는 효율성이 높지만 삽입, 수정, 삭제에는 오히려 더 느려지기 쉽습니다. 삭제시에는 index 테이블에서 제외하는 것이 아니라 접근불가 처리를 하고, 수정시에 삭제 후 입력을 하기 때문에 본 데이터보다 index 테이블이 더 늘어나 비효율적이 될 수 있습니다. 따라서 검색이 많고 삽입, 수정, 삭제가 적은 스키마에 적용하는 것이 적절합니다. InnoDB는 인덱스 정보가 ibdata1에 저장됩니다.
실제 진행한 프로젝트의 ibdata1과 .ibd, .frm
인덱스 알고리즘
클러스터드 인덱스와 비클러스터드 인덱스 : PK값이 비슷한 인덱스들을 모아둔 것을 클러스터드 인덱스라고 하며 한 테이블당 한 개만 설정 가능합니다. 이에 비해 비클러스터드 인덱스는 한 테이블당 여러개 생성할 수 있습니다.
Table Full Scan vs Index Range Scan vs Index Full Scan : Table Full Scan은 한 I/O당 많은 데이터를 받아오기 때문에 오히려 Index Range Scna보다 빠를 수 있습니다. Index Range Scan은 방대한 데이터에서 소수의 검색을 할 때 유리하고 Table Full Scan은 검색이 잦을 때 유리합니다. Index Full Scan은 Index Range Scan이 어려울때 사용하지만 Index Range Scan이 더 권장됩니다.
Database pool : DB에 접근하는 커넥션들을 모아두고 돌아가면서 사용하도록 만들어둔 pool입니다.
Statement vs PreparedStatement : 둘다 JDBC에서 sql문을 실행하기 위한 class입니다. PreparedStatement는 Statement와 달리 미리 컴파일 되어있어서 빠르고 가독성이 높아 많이 사용됩니다.
ORM : Object-Relational Mapping으로서 객체와 테이블을 연결시켜주는 것입니다.
JDBC vs JPA : JDBC는 Java DataBase Conectivity로 자바에서 제공하는 db 연결 API이고 JPA는 Java Persistence API로서 자바에서 사용하는 ORM의 일종입니다. JPA는 JDBC에 비해서 가독성이 높고 객체로 db에 접근할 수 있어서 로직에 집중할 수 있으며 자바 고유의 기능들을 많이 사용할 수 있다는 장점이 있지만 잘못 사용하면 오히려 속도가 더 느려지는 단점이 있습니다.