Explain 정보 보는법


1. 인덱스가 적절히 사용되고 있는지 검토

2. 나열된 순서는 MYSQL이 쿼리처리에 사용하는 순서대로 출력

 



Explain의 각 행 설명


1. id : SELECT 번호, 쿼리내의 SELECT 의 구분번호, 실행순서

 


2. select_type : SELECT 의 타입

- SIMPLE: 단순 SELECT (UNION 이나 서브쿼리를 사용하지 않음)

- PRIMARY: 가장 외곽의 SELECT

- UNION: UNION 에서의 두번째 혹은 나중에 따라오는 SELECT

- DEPENDENT UNION: UNION 에서의 두번째 혹은 나중에 따라오는 SELECT, 외곽쿼리에 의존적

- UNION RESULT: UNION 의 결과물

- SUBQUERY: 서브쿼리의 첫번째 SELECT

- DEPENDENT SUBQUERY: 서브쿼리의 첫번째 SELECT, 외곽쿼리에 의존적

- DRIVED: SELECT 로 추출된 테이블 (FROM 절 내부의 서브쿼리)

 


3. table : table명

 


4. type : 조인타입, 우수한 순서대로… 뒤로갈수록 나쁜 조인형태

1) system : 테이블에 단 하나의 행만 존재(시스템 테이블). const join 의 특수한 경우 (거의 메모리에 상주)

2) const : 많아야 하나의 매치되는 행만 존재할 때, PRIMARY KEY 나 UNIQUE index 를 상수와 비교할 때, 각 컬럼값은 나머지 연산에서 상수로 간주, 처음 한번만 읽어들이면 되므로 매우 빠름

3) eq_ref : 조인수행을 위해 각 테이블에서 하나씩의 행만이 읽히는 경우, 조인연산에  PRIMARY KEY 나 UNIQUE index 인덱스가 사용되는 경우, 인덱스된 컬럼이 = 연산에 사용되는 경우

4) ref : 이전 테이블과의 조인에 사용될 매치되는 인덱스의 모든행이 이 테이블에서 읽혀질 때, leftmost prefix 키만을 사용하거나 사용된 키가 PRIMARY KEY 나 UNIQUE 가 아닐때

(즉 키값으로 단일행을 추출할수 없을때)

사용된 키가 적은수의 행과 매치되면 이것은 적절한 조인 타입.

ref 는 인덱스된 컬럼과 = 연산에서 사용됨

5) ref_or_null : ref 와 같지만 NULL 값을 포함하는 행에대한 검색이 수반될 때. 서브쿼리 처리에서 대개 사용됨

6) index_merge : 인덱스 병합 최적화가 적용되는 조인 타입. 이 경우, key 컬럼은 사용된 인덱스의 리스트를 나타내며 key_len 컬럼은 사용된 인덱스중 가장 긴 key 명을 나타냄

7) unique_subquery : 몇몇 IN 서브쿼리 처리에서 ref 타입대신 사용됨. unique_subquery 는 성능향상을 위해 서브쿼리를 단순 index 검색 함수로 대체함.

8) index_subquery : unique_subquery 와 마찬가지로 IN 서브쿼리를 대체. 단, 서브쿼리에서 non-unique 인덱스가 사용될때 동작 함

9) range : 인덱스를 사용하여 주어진 범위 내의 행들만 추출

key 컬럼: 사용된 인덱스 / key_len: 사용된 가장 긴 key 부분 / ref 컬럼: 이 타입의 조인에서 NULL

키 컬럼이 상수와 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN 또는 IN 연산에 사용될때 적용됨

10) index : 인덱스가 스캔된다는걸 제외하면 ALL 과 같음. 일반적으로 인덱스 파일이 데이타파일보다 작기 때문에 ALL 보다는 빠름. MySQL 은 쿼리에서 단일 인덱스의 일부분인 컬럼을 사용할때 이 조인타입을 적용함

11) ALL

이전 테이블과의 조인을 위해 풀스캔. (조인에 쓰인) 첫번째 테이블이 고정이 아니라면 비효율적. 대부분의 경우에 아주 느린 성능

정리:

system - const - eq_ref - ref - ref_or_null - index_mergy - unique_subquery -  ndex_subquery - range - index - ALL

 


5. possible_keys : MySQL 이 해당 테이블의 검색에 사용할수 있는 인덱스들. possible_keys 에 나타난 인덱스들이 결과에 나타난 테이블 순서에서 실제 사용할 수 없을수도 있음

 


6. key :  MySQL 이 실제 사용한 key(index)

 


7. key_len : MySQL 이 사용한 인덱스의 길이, key 컬럼값이 NULL 이면 이값도 NULL

key_len 값으로 MySQL 이 실제 복수컬럼 키중 얼마나 많은 부분을 사용할 것인지 알 수 있음

 


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

 


9. rows : 쿼리 수행에서 MySQL 이 예상하는 검색해야할 행수

 


10. Extra : MySQL 이 쿼리를 해석한 추가적인 정보를 나타냄

1) Distinct: MySQL 이 매치되는 첫행을 찾는 즉시 검색을 중단한다는 의미

2) Not exists: MySQL 이 LEFT JOIN 을 수행함에 매치되는 한 행을 찾으면 더이상 매치되는 행을 검색x

3) range checked for each record (index map: #): MySQL 이 사용할 좋은 인덱스가 없음 의미

4) Using filesort: MySQL 이 정렬을 위해 추가적인 과정을 필요로 함

5) Using index: 컬럼정보가 실제 테이블이 아닌 인덱스트리에서 추출, 쿼리에서 단일 인덱스된 컬럼들만을 사용하는 경우

6) Using temporary: MySQL 이 결과의 재사용을 위해 임시테이블을 사용, 쿼리 내에 GROUP BY 와 ORDER BY 절이 각기 다른 컬럼을 사용할때 발생

7) Using where: WHERE 절이 다음 조인에 사용될 행이나 클라이언트에게 돌려질 행을 제한하는 경우 테이블의 모든 행을 검사할 의도가 아니면 ALL 이나 index 라면 쿼리사용이 잘못된 것임

Using sort_union(…) , Using union(…) , Using intersect(…)

Using index for group-by: Using index 와 접근방식이 같으며, 추가적인 디스크 접근 없이 GROUP BY 나 DICTINCT 쿼리에 사용된 모든 컬럼에 대한 인덱스를 찾았음을 의미

 

정리

쿼리를 가능한 한 빠르게 하려면, Extra 값의 Using filesort 나 Using temporary 에 주의해야 함

EXPLAIN 의 출력내용중 rows 컬럼값들을 곱해봄으로써 얼마나 효과적인 join 을 실행하고 있는지 알 수 있다 



by 차까꿍 2014. 7. 17. 20:01

1. Syntax Highlighter 설치

1) 다운로드

다운로드는 의외로 간단하다. Syntax Highlighter 공식 홈페이지에서 다운로드 받을 수 있다. 
위 링크를 클릭하면 큼지막 하게 Click Here to Download. 라고 씌여있다.
이 제작자분께서 강력하게 Donate를 원하는 것 같으니 죽어가는 개발자를 위해 Paypal로 돈을 보내줄수도 있겠다.


2) 파일업로드

파일을 다운로드 한 다음 압축을 해재하여, 티스토리의 HTML/CSS 편집에서 추가한다.




3) HTML/CSS 소스수정

이제 HTML/CSS를 수정해 줘야 하는데
Tistory 관리 > HTML/CSS 편집으로 들어가서 skin.html 영역의 <head>와 </head> 사이에
아래 소스를 붙여넣기 해줍니다.
넣는위치를 잘 모를경우 </head> 바로 위에 넣는다고 생각하면 됩니다.


아래 굵게 표시한 부분은 테마로 원하는 css로 변경해 줍니다.
테마는 업로드했던 styles 디렉토리에 shTheme***.css형태로 되어 있습니다.


<!-- SyntaxHighlighter Start -->
<link type="text/css" rel="stylesheet" href="./images/shCore.css">
<link type="text/css" rel="stylesheet" href="./images/shThemeMidnight.css">
<script type="text/javascript" src="./images/shCore.js"></script>
<script type="text/javascript" src="./images/shLegacy.js"></script>
<script type="text/javascript" src="./images/shBrushBash.js"></script>
<script type="text/javascript" src="./images/shBrushCpp.js"></script>
<script type="text/javascript" src="./images/shBrushCSharp.js"></script>
<script type="text/javascript" src="./images/shBrushCss.js"></script>
<script type="text/javascript" src="./images/shBrushDelphi.js"></script>
<script type="text/javascript" src="./images/shBrushDiff.js"></script>
<script type="text/javascript" src="./images/shBrushGroovy.js"></script>
<script type="text/javascript" src="./images/shBrushJava.js"></script>
<script type="text/javascript" src="./images/shBrushJScript.js"></script>
<script type="text/javascript" src="./images/shBrushPhp.js"></script>
<script type="text/javascript" src="./images/shBrushPlain.js"></script>
<script type="text/javascript" src="./images/shBrushPython.js"></script>
<script type="text/javascript" src="./images/shBrushRuby.js"></script>
<script type="text/javascript" src="./images/shBrushScala.js"></script>
<script type="text/javascript" src="./images/shBrushSql.js"></script>
<script type="text/javascript" src="./images/shBrushVb.js"></script>
<script type="text/javascript" src="./images/shBrushXml.js"></script>
<script type="text/javascript">
SyntaxHighlighter.all();
</script>
<!-- SyntaxHighlighter End -->

그리고, 범용성을 늘리기 위해 textarea 태그를 이용할 것이므로 추가 수정이 필요한데
<body> 를 아래와 같이 변경해 줍니다.

<body Onload="dp.SyntaxHighlighter.HighlightAll('code');">



2. Syntax Highlighter 사용법

1) 기본

<textarea name="code" class="brush:사용할언어;"> 
이 사이에 소스코드를 작성하면 됩니다.
</textarea>




2) highlight 옵션이용

<textarea name="code" class="brush:사용할언어;highlight:[2,5]"> 
이 사이에 소스코드를 작성하면 됩니다.
</textarea>




3) 그외 옵션이용

<textarea name="code" class="brush:사용할언어;toolbar:false;gutter:false;"> 
이 사이에 소스코드를 작성하면 됩니다.
</textarea>




4) 지정 할 수 있는 속성

속성

기본값

설명

auto-links

true

URL을 클릭하면 페이지 이동이 가능하도록
하이퍼링크를 자동으로 걸어준다.

class-name

''

그외 사용자 지정 class를 추가하고 싶을때 사용한다.

collapse

false

"펼치기" 기능을 사용하고 싶을 때
(
티스토리의 "더보기" 기능이 더 나은것 같다)

first-line

1

시작 Line Number를 지정한다.

gutter

true

Line Number를 켜고 끌수 있다.

highlight

null

강조할 라인을 배열로 넘긴다.
(
: "brush: plain; highlight: [1, 3]")

html-script

false

php, asp, jsp 등과 같이 소스 코드안에 html이 포함되는 경우
html
도 하이라이팅하고 싶으면 사용한다

smart-tabs

true

스마트탭 기능의 활성화 여부를 지정한다
(
무슨 기능인지 잘 모르겠다)

tab-size

4

TAB 크기를 지정한다.

toolbar

true

툴바를 켜거나 끌 수 있다.


5) highlight 가능한 언어

분류

사용가능 brush 

필요 파일

 Bash/shell

 bash, shell

 shBrushBash.js

 C#

 c-sharp, csharp

 shBrushCSharp.js

 C++

 cpp, c

 shBrushCpp.js

 CSS

 css

 shBrushCss.js

 Delphi

 delphi, pas, pascal

 shBrushDelphi.js

 Diff

 diff, patch

 shBrushDiff.js

 Groovy

 groovy

 shBrushGroovy.js

 JavaScript

 js, jscript, javascript

 shBrushJScript.js

 Java

 java

 shBrushJava.js

 Perl

 perl, pl

 shBrushPerl.js

 PHP

 php

 shBrushPhp.js

 Plain Text

 plain, text

 shBrushPlain.js

 Python

 py, python

 shBrushPython.js

 Ruby

 rails, ror, ruby

 shBrushRuby.js

 Scala

 scala

 shBrushScala.js

 SQL

 sql

 shBrushSql.js

 Visual Basic

 vb, vbnet

 shBrushVb.js

 XML

 xml, xhtml, xslt, html, xhtml

 shBrushXml.js

 


'프로그래밍 > 기타' 카테고리의 다른 글

GCM  (0) 2014.09.03
by 차까꿍 2014. 6. 10. 15:45
| 1 ··· 3 4 5 6 |