전체 글 120

쿼리 작성 및 최적화 (1)

인덱스를 사용하기 위한 기본 원칙 인덱스 컬럼 가공 X 예시) salary * 10 인덱스 컬럼의 데이터 타입과 where 절의 데이터 타입이 같아야함 select * from tb_test where age=2 ( age(varchar(10), index ix_age(age) ) ⇒ 이런 경우 데이터 타입이 달라서 인덱스 풀스캔 하게됨 where 절의 index 사용 범위 제한 조건 동등 비교, in으로 구성된 조건이 인덱스를 구성하는 컬럼과 얼마나 좌측부터 일치하는가에 따라 다름 SELECT * FROM employees WHERE first_name='Kebin' OR last_name='Poly'; 위 쿼리에서 first_name='Kebin' 조건은 인덱스를 이용할 수 있지만 last_name=..

책/real mysql 2022.01.12

드라이빙 테이블 - 드리븐 테이블

👀 드라이빙 테이블 (DRIVING TABLE)이란? JOIN시 먼저 액세스 돼서 ACCESS PATH를 주도하는테이블 👀 드리븐 테이블(DRIVEN TABLE, INNER TABLE) 나중에 액세스 되는 테이블을 드리븐 테이블(DRIVEN TABLE, INNER TABLE) 조인시 영향 인덱스(INDEX)의 존재 및 우선순위 혹은 FROM절에서의 TABLE 지정 순서에 영향을 받음 많은 양의 데이터를 다룰 때, 드라이빙 테이블은 매우 중요하다. 예시 10000건의 데이터 A 5000건의 데이터 B 10000건을 먼저 드라이빙하게 된다면 -> 10000번 돌면서 B테이블 탐색 5000건을 먼저 드라이빙하게 된다면 -> 5000번 돌면서 탐색 결정 규칙 규칙기반 옵티마이저(Rule-Based Optimiz..

책/real mysql 2022.01.12

개발자 측면 2021 회고

일단 회고부터 처음 써본다... 먼저 2021년은 대학교 4학년으로서 개발 동아리(스터디)와 개발자 1년 차를 보냈다. 솔직히 학교가 상위권 학교는 아니여서 배울게 엄~~ 청 많다고는 생각을 못했다. 그래서 우연히 인턴을 할 수 있게 돼서 4월달에 인턴을 하게 됐다. 스터디를 하며... 일단 2021년도 초에 코딩 잘하는 친구가 같이 스터디하자고 해서 그 친구랑 동아리(?) 비슷하게 스터디를 했다. 일단 나는 4학년이지만 군대갔다가 이제 막 코딩을 시작하는(html, css, javascript, c, c++ 등 기본적인 것만 한) 코린이었기에 그 친구가 프로젝트나 스터디를 같이 하자는 거에 당연히 동의를 했다. 솔직히 지금 이 글을 쓸 때쯤 생각해보니 진짜 너무 고마운 친구였다. (이 친구는 모두가 아..

5. 인덱스(2) - 그외 인덱스

이전글에서 이어진 글입니다 https://balldev.tistory.com/59 5장. 인덱스 디스크 읽기 방식 데이터베이스의 성능 튜닝은 어떻게 디스크 I/O를 줄이느냐가 관건인 것들이 상당함 저장 매체 DAS 컴퓨터의 본체와 달리 디스크만 있음 모두 SATA SAS와 같은 케이블로 연결되어 balldev.tistory.com 해시 인덱스 해시 인덱스는 동등 비교 검색에는 최적화 but 범위를 검색한다거나 정렬된 결과를 가져오는 목적으로는 사용할 수 없다. DBMS에서 메모리 기반의 테이블에 주로 구현 → 대용량 테이블용으로는 사용 X 구조 및 특성 실제 키 값과는 상관 없이 인덱스 크기가 작고 검색이 빠름 검색하고자 하는 값을 주면 해시함수를 거쳐서 키 값이 포함된 버켓을 알 수 있음. 그리고 하나..

책/real mysql 2021.12.30

5장. 인덱스

디스크 읽기 방식 데이터베이스의 성능 튜닝은 어떻게 디스크 I/O를 줄이느냐가 관건인 것들이 상당함 저장 매체 DAS 컴퓨터의 본체와 달리 디스크만 있음 모두 SATA SAS와 같은 케이블로 연결되어서 사용자에게는 같은 방식으로 사용됨 하지만 반드시 하나의 컴퓨터 본체에만 연결해서 사용 가능 → 컴퓨터가 동시에 공유하는 것이 불가능 NAS TCP/IP를 통해 연결됨 여러 컴퓨터에서 공유해서 사용할 수 있는 저장 매체지만 SATA/SAS 방식에 비해 속도가 느림 데이터 비용으로는 사용 X SAN 대용량의 스토리지 공간 여러 컴퓨터 사용 가능, 광케이블로 연결돼서 빠름 하지만 고가의 구축 비용 SSD 원판을 제거하고 메모리를 장착 → 기계적으로 회전 X 빠르게 데이터 읽고 쓰기 가능, 전원이 공급되지 않아도..

책/real mysql 2021.12.30

트랜잭션 격리 수준

이전글에 연장입니다.~ https://balldev.tistory.com/57 트랜잭션과 잠금 트랜잭션이란? 트랜잭션은 작업의 완전성을 보장해 주는 것이다. 즉, 논리적인 작업 셋을 모두 완벽하게 처리하거나 또는 처리하지 못할 경우 원 상태로 복구해서 작업의 일부만 적용되는 현상 balldev.tistory.com 격리수준이란? 트랜잭션끼리 얼마나 서로 고립되어 있는지를 나타내는 것 Isolation level 종류 Read Uncommitted (level 0) SELECT 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리지 않는 계층 아직 Commit되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용 일관성을 유지하는 것이 불가능 Dirty read 발생 Read committed (l..

책/real mysql 2021.12.27

트랜잭션과 잠금

트랜잭션이란? 트랜잭션은 작업의 완전성을 보장해 주는 것이다. 즉, 논리적인 작업 셋을 모두 완벽하게 처리하거나 또는 처리하지 못할 경우 원 상태로 복구해서 작업의 일부만 적용되는 현상이 발생하지 않게 하는 기능!!! 잠금 vs 트랜잭션 잠금 - 동시성을 제어하기 위한 기능 트랜잭션 - 데이터의 정합성을 보장하기 위한 기능 트랜잭션 정의와 특징 db의 상태를 변화시키기 위해 수행하는 단위 그리고 하나의 트랜잭션은 commit 되거나 rollback 되거나 합니다. 트랜잭션의 특징(ACID) atomicity(원자성) - 트랜잭션 연산은 모두 반영되던가 전혀 반영이 되지 않아야한다. consistency(일관성) - 성공적으로 완료하면 일관성 있는 데이터 베이스 상태로 변환 isolation(격리성) - ..

책/real mysql 2021.12.27

mysql 아키텍처

mysql 서버는 크게 mysql 엔진과 스토리지 엔진으로 구분 mysql 엔진 클라이언트로부터 접속 및 쿼리 요청을 처리하는 커넥션 핸들러와 sql파서 및 전처리기, 쿼리의 최적화된 실행을 위한 옵티마이저가 중심 sql 문장을 분석, 최적화 스토리지 엔진 디스크 스토리지에 저장하거나 디스크 스토리지로부터 데이터를 읽어오는 부분은 스토리지 엔진이 전담 쓰기 또는 읽기를 요청 → handler 요청 , 여기서 사용하는 api → handler api mysql서버는 프로세스 기반이 아니라 스레드 기반 포그라운드 스레드 서버에 접속된 클라이언트 수 만큼 존재 백그라운드 스레드 innoDB 쓰기 작업은 지연 가능 읽기 작업은 지연 불가능!! 대부분 DBMS는 쓰기 작업을 버퍼링해서 일괄 처리하는 기능이 탑재돼..

책/real mysql 2021.12.21

spring boot에서 filter

spring mvc request lifecycle 위의 사진은 spring이 컨트롤러 까지 가는데의 과정입니다. 보통 웹 개발을 하다보면 중복으로 처리하는 코드들이 많이 생깁니다. 인증, 인가, 세션, xss 방어 등을 필터, 인터셉터, AOP 등 상황에 맞게 처리합니다. 먼저 필터를 보겠습니다. http 요청 및 응답을 가로채는데 사용됩니다. request를 필터링 response를 필터링 @Component public class SampleFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { Filter.super.init(filterConfig); } @Ove..

spring boot 에서 argumentResolver

api 엔드 포인트로부터 들어온 데이터를 가공하여 필요한 데이터만 뽑는 경우 많이 사용한다. argumentResolver는 interceptor 요청 뒤에 이루어집니다. 예시로 argumentResolver로 memberId를 뽑아보도록 하겠습니다. 만약 argumentResolver가 없다면?? @GetMapping("/memberId") private void memberId(HttpSession session){ ... Long memberid = session.getAttribute("memberId"); ... } 이렇게 컨트롤러마다 memberId를 뽑아야합니다.... 그래서 argumentResolver를 사용해보겠습니다. @Target(ElementType.PARAMETER) @Reten..