◈ select
- mysql 의 limit은 where 조건으로 사용하지않고 모든 처리결과의 레코드건수를 제한하는 형태로 사용한다.
- where, order by , group by가 인덱스를 사용하려면 컬럼값을 변형하지않고 그대로사용해야 한다.
- where 절에 or조건이있다면 인덱스 머지, 등의 방법을 구사해야한다.
- group by 절의 컬럼순서가 인덱스 컬럼 순서와 같으면 group by 절은 인덱스를 탈 수 있다.
- order by 절의 모든 컬럼이 asc, desc일때만 인덱스를 탈 수 있다.
- where + order by 절이 같은 컬럼이 연속 포함될 경우 같은 인덱스를 탈 수 있다.
- where절에 일치하는 레코드건수 많지않을 때 where절만 인덱스를 이용하는 튜닝방법을 거친다
- order by 절을 순서대로 읽으면서 레코드 한건씩 where 조건에 일치하지 않을때 버리는 형태로 처리한다.
(레코드 정렬 +조회시 이런형태로 튜닝한다)
- where와 order by절에 중간에 하나라도 빠지는 컬럼이있다면 인덱스를 탈 수없다.
- group by와 orderby절에 사용된 쿼리에서 모두 인덱스를 타려면 각 두 구절의 명시된 컬럼의 순서와 내용이 모두 같아야한다.
- mysql은 null값이 포함된 레코드도 인덱스로 관리한다.(null을 하나의 값으로 인정함)
ex> select null = null;
select case when null=null then1 else 0 end
select case when null is null the 1 else 0 end
- 인덱스등의 이슈로 isnull()보단 is null 연산자를 사용하길 권장한다.
- 날짜(date), 날짜+시간(datetime, timestamp), 시간(time)
- select distinct vs group by (distinct는 정렬이 보장되지 않는다 인덱스를 이용하지 못하는 경우 )
- select절에 사용된 distinct는 전체 컬럼에 영향을 미친다. (일부컬럼만 유일하게 조회는방법은 없다!)
- 실행계획의 using temporary는 임시테이블을 만든것을 의미한다.
- distinct가 집합함수와 사용된경우 특정컬럼의 distinct값을 만들어낼 수 있다 (윗윗내용과 상반됨)
- limit 는 mysql에만 존재하는 키워드이다. 상위 n건까지 정렬이되면 작업을 멈춘다.
limit 10,10 -> (1~10 상위, 11~21 상위)
limit 0,10 = limit 10
'SQL > Mysql' 카테고리의 다른 글
mysql 사용자 정의 변수(a.k.a.사용자함수) 총정리 [출처:Real Mysql] (0) | 2021.02.23 |
---|---|
Mysql- insert절 용법 총정리(Real Mysql) (0) | 2021.02.16 |
MYSQL 연산자/like연산자/between연산자/in연산자 (REAL MY SQL 정리) (0) | 2021.02.14 |
MYSQL 내장함수 / 문자열처리/타입변환/처리대기/벤치마크/암호화/aggregation function/주석 (REAL MY SQL 정리) (0) | 2021.02.13 |
MYSQL 리터럴 모음 (REAL MY SQL 정리) (0) | 2021.02.12 |