📝DB 인덱스 (Index)
DB 인덱스(Index)는 데이터베이스에서 검색 속도를 향상시키기 위해 사용되는 데이터 구조이다
인덱스 생성 방법으론 다양한 게 있지만 기본적으로 INSERT, UPDATE, DELETE가 자주 발생하지 않는 컬럼을 사용해야하고(인덱스를 생성할 때 성능 이슈가 발생) JOIN이나 WHERE 또는 ORDER BY에 자주 사용되는 컬럼에 효과적이다.
카디널리티가 높은 컬럼을 사용하는게 좋다.
인덱스를 사용하는 것 만큼이나 생성된 인덱스를 관리해주는 것도 중요하다. 그러므로 사용되지 않는 인덱스는 바로 제거를 해주는게 좋다
📝DB Cursor(커서)
커서는 기본적으로 행 단위 반복처리(for/wihle)를 가능하게 합니다. (한 행씩 읽어서 처리)
DB 서버가 쿼리 결과를 메모리나 디스크에 잡아두기 때문에 부하가 들어갑니다.
SELECT id, my_function(id)
FROM big_table;
# --------------------------
CALL my_procedure();
함수보다는 프로시져에서 더 많이 사용합니다. 함수의 경우 big_table이 100행이 있으면 100에 해당하는 걸 다 실행시키기 때문에 커서가 100번 사용되지만 프로시져의 경우는 1번만 사용 됩니다.
📝함수(function)
특정 계산을 수행하며 쿼리 내에서 계산된 값을 반환한다. (하나의 값을 반환하는 계산식에 적합)
대부분 트랜잭션을 지원 안 하기 때문에 INSERT, UPDATE, DELETE가 안에 들어가면 제어가 힘들어집니다.
계산하고 반환하는데 중점을 두기 때문에 주로 SELECT문에서 많이 사용한다. (아래 예제처럼 필드처럼 호출이 가능)
SELECT get_keywords();
📝프로시저(procedure)
특정 작업을 수행하며 리턴값이 없을 수 있다
트랜잭션 기능을 지원합니다.
프로시저는 주로 데이터 조작 작업(INSERT, UPDATE, DELETE)이나 특정 비즈니스 로직을 수행하는 데 사용하며 단독으로 실행이 가능하다
함수처럼 매개변수를 받을 수 있고 특정 작업들을 수행하지만 뭔가를 반환하는 것보다는 일련의 함수 동작을 수행한다
→ 물건 구매했을 때 구매목록 테이블에 데이터 INSERT되고 배송 테이블에 데이터 INSERT되고 등... 여러 행위를 하나로 묶은 프리시저를 만들어서 활용할 수 있다
CALL UpdateEmployeeSalary(1, 50000);
📝BigInt, SmallInt
- SMALLINT
- 2바이트, 값 범위 작음, 저장 공간 절약
- BIGINT
- 8바이트, 값 범위 큼, 초대규모 데이터에 필요