테이블 및 쿼리 작성법

Updated:

Goal

  • 테이블 및 쿼리 작성법을 이해한다.
  • 인덱스 생성 및 비용에 대해 이해한다.
  • NOW() 와 SYSDATE() 차이를 알 수 있다.

테이블 작성하는 법

  • data type 은 최대한 작게 설계하기

  • Char(1)
    • ‘Y’, ‘N’ / 직관적
  • Tinyint
    • 0,1 저장 -> 1byte

NOT NULL 속성 적용

  • 기본이 null 허용

  • mysql 은 null 허용하면 컬럼당 1byte 를 추가적으로 사용한다.

쿼리 작성하는 법

  • Select 절에는 필요한 컬럼만 작성
    • 불필요한 자원 소모
    • select * (x)

인덱스 생성 기준

cardinality

  • 인덱싱 된 컬럼의 유니크한 값의 수

  • show index from 컬럼명;

  • 8개의 페이지 샘플링으로 통계된 값. 근사치 확인

  • cardinality가 높으면 유니크한 값들이 많다는 뜻

결합 인덱스(컬럼 여러개) 생성시 고려

equal 조건은 좌측, range 조건은 우측 배치

join절의 on에 해당하는 컬럼에 인덱스 추가

Create index idx_rest on reservation (reservationid);

인덱스도 비용이다.

  • 테이블과 마찬가지로 공간을 차지

  • insert, update, delete시 인덱스도 변경 필요. 조회는 빠름

  • 쿼리 빈도수/ 쿼리 조건절/ 데이터 분포도에 따라 최소한의 인덱스를 생성하기

(int) order_no = '1' 
# 우측에서 형변환. 인덱스 활용 가능

(varchar) order_status_cd = 10; 
# str이라서 좌측에서 형변환. 인덱스 활용 불가

(datetime) order_umdt = '2011-02-17'; 
# 우측에서 형변환. 인덱스 활용 가능

# 결론 : 이런거 따지지말고 똑같이 dateType 맞춰주자.

LIKE

  • 와일드카드가 검색어 앞쪽 -> 인덱스 레인지 스캔 불가
  • 웬만하면 like 안쓰는 것이 좋음

NOW() vs SYSDATE()

select SYSDATE(), sleep(2), SYSDATE();
  • now()는 두번쓰면 동일한 결과.

  • sysdate() 는 두번쓰면 다른결과.

    • sysdate는 안정적으로 복제 불가 (master에 실행된것을 슬레이브에 넘기는데 넘겨주는 데이터가 각각 달라서 날짜의 차이가 발생하게 된다. )
    • Now()쓰는 것을 권장

실행계획 결과 정보 확인 방법

  • 쿼리앞에 explain 붙혀주기
  • Explain format = tree (모양 보기편함)

Reference

교육명 : NHN basecamp SQL 이론 및 쿼리 검수 결과 공유

강사님 성함 : 남준희 선임님

교육 요약 내용입니다. (좋은 교육 감사합니다!)

Leave a comment