반응형

한 컬럼의 여러 값을 조회 => Index 값이 나온다.

 

name hobbies
Adam swimming
Amy reading,sports,swimming
Carl filmwatching,writing
Carol reading,swimming
Deril sports
Jake reading,sports,swimming
Lola reading,sports,painting
Nina sports,painting
Sam sports

 

select name, FIND_IN_SET('reading', hobbies) as idx from people_hobbies;

 

name idx
Adam 0
Amy 1
Carl 0
Carol 1
Deril 0
Jake 1
Lola 1
Nina 0
Sam 0

 

반응형

'개발관련 > DB' 카테고리의 다른 글

MYSQL>집계함수 곱연산  (0) 2019.03.26
MYSQL>Explain  (0) 2019.03.26
MSSQL>페이징 처리  (0) 2017.07.04
반응형

 id

 characters

 color

 1

 code

 blue 

 2

 fights

 white


SELECT EXP(SUM(LOG(LENGTH(characters)))) as combinations


from discs;



EXP SUM LOG 로 계산한다.

반응형

'개발관련 > DB' 카테고리의 다른 글

MYSQL>FIND_IN_SET  (0) 2019.03.29
MYSQL>Explain  (0) 2019.03.26
MSSQL>페이징 처리  (0) 2017.07.04
반응형

MySQL Troubleshooting 발췌


MySql 서버는 언제나 입력한 대로 쿼리를 실행하지 않는다. 


대신 사용자가 더 빨리 결과를 얻을 수 있도록 쿼리 옵티마이저를 호출하여 더 좋은 실행계획을 만든다.


테이블이 Index를 가지고 있지 않는 경우 MySql는 결과를 제한할 수 있을때 인덱스를 사용한다.


따라서 Where, JOIN, Group By, Order by 절에 들어가는 열이 인덱스를 가지고 있다면 성능이 향상된다.


※ EXPLAIN EXTENDED SELECT 구문을 사용한 후 SHOW WARNINGS 을 사용하면 최적화된 쿼리를 보여준다.


 id

 select_type

 table

 partitions

 type

 possible_keys

 key

 key_len

 ref

 rows

 filtered

 Extra


컬럼 설명


select_type :


단순 쿼리 : Simple


복합 쿼리

 PRIMAY

 가장 바깥쪽 쿼리

 UNION

 UNION 중 두번째 OR 나중에 따라오는 SELECT

 DEPENDENT UNION

 바깥쪽 쿼리에 종속적인 UNION 쿼리

 UNION RESULT

 UNION 결과물

 SUBQUERY

 서브쿼리의 첫번째 SELECT

 DEPENDENT SUBQUERY

 바깥쪽 쿼리에 종속적이고 서브쿼리 중 첫 SELECT

 DERIVED

 SELECT로 추출된 테이블 즉 FROM 절 내부의 쿼리(임시테이블) => 임시테이블은 메모리나 디스크에 저장이 가능
메모리에 저장되는 경우 성능에 영향이 없지만 디스크에 저장시엔 성능이 떨어지게 된다.

 UNCACHEABLE SUBQUERY

 서브 쿼리 결과를 내부 캐시 공간에 저장하지 못하는 경우

 1.사용자 변수가 서브쿼리에 사용된 경우

 2.RAND()와 같이 결과 값이 호출될때마다 달라지는 함수가 subQuery에 사용되는 경우

 UNCACHEABLE UNION

 Union 쿼리 결과가 내부 캐시 공간에 저장하지 못하는 경우


table : 접근하는 Table 명


type :  위에서부터 아래로 갈수록 성능 저하가 발생된다.


 system

 테이블이 하나의 열만 가지고 있다.

 const

 하나의 매칭 테이블을 가지고 있는데 쿼리가 시작되는 시점에서 이 테이블을 읽게된다.

 여기에는 하나의 열만 가지고 있기 때문에 이 열에 있는 컬럼에서 얻는 값들은 나머지 옵티마이저에 의해서 상수로 인식 될 수 있다.

const 테이블은 한번 밖에 읽혀지지 않기때문에 매우 빠르다.

 eq_ref

 테이블로부터 각 열을 조합하기 위해 테이블의 열을 하나 읽는다. system 및 const 타입과는 달리 가장 최선의 가능 조인 타입이다.

 ref

 JOIN의 순서와 인덱스의 종류에 상관없이 인덱스로 지정된 컬럼끼리의 '=', '<=>'와 같은 연산자를 통한 비교로 수행되는 Join

 ref_or_null

 ref와 유사하지만 Null을 가지고 잇는 열에 대해서도 검색을 한다.

 unique_subquery

 Where 조건절에서 사용될 수 있는 IN 서브 쿼리에 대해서 ref를 대체한다. 단 하나의 결과만을 반환하는 서브쿼리에 사용

 index_subquery

 unique_subquery와 유사하지만 여러개의 결과를 반환하는 경우에 사용한다.

 range

 특정한 범위의 열을 매칭하는데 인덱스가 사용되는 경우

 index_merge

 2개 이상의 인덱스를 이용해 각각의 검색 결과를 만들어 낸 후 그 결과를 병합하는 처리 방식

 index

 인덱스 풀 스캔

 all

 테이블 풀 스캔


possible_keys : MySql이 해당 테이블 검색에 사용할 수 있는 인덱스들


key : MySql이 실제 사용한 Key(인덱스)


key_len : 인덱스의 길이, Key 컬럼이 Null이면 이것도 Null


ref : 행을 추출하는데 키와 함께 사용된 컬럼이나 상수 값


rows : 쿼리 수행에서 MySql이 검색해야하는 Row의 갯수(옵티마이저 연산에 따른 추정치)

JOIN 시 Type이 ALL인 경우 ROW 행들은 곱연산이 된다.


Extra : MySql이 이 쿼리를 해석한 추가적인 정보를 나타낸다.

 distinct

 매치되는 첫 행을 찾는 즉시 검색을 중단

 not exist

 LEFT JOIN시 한 행을 찾으면 더 이상 매치되는 행을 검색을 중단

 range checked for each record(index map)

 사용할 좋은 인덱스가 없음을 의미

 using filesort

 정렬을 하기 위해 추가적인 과정이 필요함.

 using index

 컬럼 정보를 실제 테이블이 아닌 인덱스 트리에서 추출한다. 쿼리에서 단일 인덱스된 컬럼들만 사용하는 경우

 using temporary

 결과를 재사용하기 위해 임시테이블을 사용한다. 쿼리가 컬럼을 서로 다르게 목록화 하는 Group by나 Order By 구문을 가지고 있는 경우에 발생한다.

 using where

 Where 절이 다음 조인에 사용될 행이나 클라이언트에게 돌려질 행을 제한하는 경우이다. 

테이블에서 모든 열을 검색하는 경우가 아니라면 쿼리에 문제가 생길 수 있다.

만일 가능한 빠른 쿼리를 만들고 싶다면 using filesort 및 using temporary 값을 조사하도록 한다.

 using sort_union, using_union, using_intersect, using index for group-by

 using index와 접근 방식이 같으며 추가적인 디스크 접근 없이 Group by나 Distinct 쿼리에 사용된 모든 컬럼에 대한 인덱스를 찾았음을 의미한다.


반응형

'개발관련 > DB' 카테고리의 다른 글

MYSQL>FIND_IN_SET  (0) 2019.03.29
MYSQL>집계함수 곱연산  (0) 2019.03.26
MSSQL>페이징 처리  (0) 2017.07.04
반응형

https://technet.microsoft.com/ko-kr/library/gg699618(v=sql.110).aspx


OFFSET-FETCH 절은 결과 집합에서 창 또는 페이지로만 결과를 내보낼 수 있는 옵션을 제공합니다. OFFSET-FETCH 절은 ORDER BY 절과만 사용할 수 있습니다.


OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }

쿼리 식에서 행의 반환을 시작하기 전에 건너뛸 행 수를 지정합니다. OFFSET 절의 인수는 0보다 크거나 같은 정수 또는 식일 수 있습니다. ROW와 ROWS를 서로 바꿔 사용할 수 있습니다.

FETCH { FIRST|NEXT } <rowcount expression> { ROW|ROWS } ONLY

OFFSET 절을 처리한 후 반환할 행 수를 지정합니다. FETCH 절의 인수는 1보다 크거나 같은 정수 또는 식일 수 있습니다. ROW와 ROWS를 서로 바꿔 사용할 수 있습니다. 이와 마찬가지로 FIRST와 NEXT를 서로 바꿔 사용할 수 있습니다.

  • OFFSET 및 FETCH 절을 사용하려면 ORDER BY가 필요합니다.

  • FETCH를 사용하려면 OFFSET 절이 필요합니다. ORDER BY … FETCH를 사용할 수 없습니다.

  • 동일한 쿼리 식에서 OFFSET 및 FETCH와 함께 TOP을 사용할 수 없습니다.

  • OFFSET/FETCH rowcount 식은 정수 값을 반환하는 산술, 상수 또는 매개 변수 식 어떤 것도 될 수 있습니다. rowcount 식은 스칼라 하위 쿼리를 지원하지 않습니다.

다음 예에서는 ORDER BY와 함께 OFFSET-FETCH 절을 사용하는 방법을 보여 줍니다.

예제 1 정렬된 결과 집합에서 첫 10개 행을 건너뛰고 나머지 행을 반환합니다.

SELECT First Name + ' ' + Last Name FROM Employees ORDER BY First Name OFFSET 10 ROWS;

예제 2- 정렬된 결과 집합에서 첫 10개 행을 건너뛰고 다음 5개 행을 반환합니다.

SELECT First Name + ' ' + Last Name FROM Employees ORDER BY First Name OFFSET 10 ROWS FETCH NEXT 5 ROWS ONLY;




CREATE PROCEDURE [dbo].[procedure.User.Fetch.Page]

@page INT,

@rows INT,

@search_word nvarchar(50)

AS


SELECT 

*

FROM [dbo].[table.User]

WHERE [id] LIKE '%' + @search_word + '%' OR [nick] LIKE N'%' + @search_word + '%'  OR [key] LIKE N'%' + @search_word + '%'

ORDER BY [id] DESC

OFFSET (@page - 1) * @rows ROWS

FETCH NEXT @rows ROWS ONLY

반응형

'개발관련 > DB' 카테고리의 다른 글

MYSQL>FIND_IN_SET  (0) 2019.03.29
MYSQL>집계함수 곱연산  (0) 2019.03.26
MYSQL>Explain  (0) 2019.03.26

+ Recent posts