본문 바로가기

SQL/Mysql

MYSQL all about Select절 (REAL MY SQL 정리)

728x90
반응형

◈ 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

728x90