b

7. 쿼리 작성 및 최적화 (ANSI SQL명령) 본문

RealMysql

7. 쿼리 작성 및 최적화 (ANSI SQL명령)

dev.bistro 2012. 11. 12. 21:14

7. 쿼리 작성 및 최적화


-

- 키워드는 대소문자를 특별히 구분하지 않고 사용 할 수 있다.

- 예약어를 테이블 명이나 칼럼명으로 사용하려면 `index` 처럼 하면 되지만, 쓰지 말자.


- 숫자 형변환 (비교 대상의 타입이 다를 경우는 자동 형 변환이 발생하고, 숫자를 우선시해서 문자열을 숫자로 바꾸는 작업을 먼저함)

  - SELECT * FROM tab_test WHERE number_column = '10001'

    10001을 상수로만 변경하면 되므로 성능에 이슈가 없다.

  - SELECT * FROM tab_test WHERE string_column = 10001

    sring_column을 항상 상수로 변경하려므로(숫자우선) 성능상 이슈가 발생, 그리고 숫자로 변경안되는 문자열도 있어서 쿼리 오류가 발생할수도 있다.


 - 날자 (MySQL은 자동으로 DATE, DATETIME으로 변환하기 때문에 STR_TO_DATE()같은 함수를 사용하지 않아도 된다)

    SELECT * FROM dept_emp WHERE from_date = '2011-04-29'

    SELECT * FROM dept_emp WHERE from_date=STR_TO_DATE('2011-04-29', '%Y-%m-%d');


- 불리언 (BOOL, BOOLEAN이 있지만, TINYINT에 대한 동의어 일 뿐이다)


- 동등비교 <=>

  = 연산자와 같으며 부가적으로 NULL 에 대한 비교도 수행한다. NULL-SAFE라고 한다

     SELECT 1=1, NULL=NULL, 1=NULL, 1 <=> 1, NULL <=> NULL, 1 <=> NULL; ---> 1, NULL, NULL, 1, 1, 0

     <=>는 한쪽만 NULL이면 false를 반환한다.


- LIKE연산 

  인덱스를 사용가능하다.

  와일드카드인 %, _가 뒤에 있다면 인덱스 레인지 스캔 가능, 앞에 있다면 사용할 수 없다.


- IN 연산

  여러개의 값에 대해 동등 비교 연산을 수행., 여러개의 값이 비교되지만, 범위가 아닌 여러번의 동등 비교로 실행 => 일반적으로 빠르다.

  IN의 입력값이 서브 쿼리라면 상당히 느려질 수 있다.

Comments