Database

[MySql] INDEX

k9e4h 2018. 5. 8. 15:33

인덱스 컬럼 기준

먼저 말씀드릴 것은 1개의 컬럼만 인덱스를 걸어야 한다면, 해당 컬럼은 카디널리티(Cardinality)가 가장 높은 것을 잡아야 한다는 점입니다.

카디널리티(Cardinality)란 해당 컬럼의 중복된 수치를 나타냅니다. 
예를 들어 성별, 학년 등은 카디널리티가 낮다고 얘기합니다. 
반대로 주민등록번호, 계좌번호 등은 카디널리티가 높다고 얘기합니다.

인덱스로 최대한 효율을 뽑아내려면, 해당 인덱스로 많은 부분을 걸러내야 하기 때문입니다. 
만약 성별을 인덱스로 잡는다면, 남/녀 중 하나를 선택하기 때문에 인덱스를 통해 50%밖에 걸러내지 못합니다. 
하지만 주민등록번호나 계좌번호 같은 경우엔 인덱스를 통해 데이터의 대부분을 걸러내기 때문에 빠르게 검색이 가능합니다.


여러 컬럼으로 인덱스를 잡는다면 카디널리티가 높은순에서 낮은순으로 구성하는게 더 성능이 뛰어남


[출처] http://jojoldu.tistory.com/243



인덱스 칼럼은 분포도를 고려하여 선정한다.

인덱스 칼럼 데이터의중복이 줄어들수록 인덱스는 최대의 효과를 가짐

하단 쿼리 결과 값이 1에 가까울수록(0.9이상 권고) 인덱스 컬럼으로 적합함

 

SELECT count(distinctINDEX_COLUMN)/count(*)

FROM TABLE;


[출처] http://egloos.zum.com/tiger5net/v/5660848




 FULLTEXT INDEX

https://kmongcom.wordpress.com/2014/03/28/mysql-%ED%92%80-%ED%85%8D%EC%8A%A4%ED%8A%B8fulltext-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B0/







Multi column index vs multiple indexes (복합키 인덱스 vs 여러 인덱스)

[출처] http://jojoldu.tistory.com/243

위 이미지가 multiple column index ( multiple column => dept_no, emp_no)

컬럼이 하나만 있고 이미지가2개있으면 multi indexes


multi column index => 가,거,겨... 로 검색

multiple index => ㄱ으로 찾은 것 중에서 ㅏ,ㅑ,...을 검색


Multiple column index vs multiple indexes? Having indexes on single columns often lead to the optimizer using the index_merge access type, which is typically not as good as accessing a single index on multiple columns. MySQL 5.6 makes multiple column indexes more efficient than before with index condition pushdown.

But don’t forget that the optimizer is not perfect: you may have to use index hints to benefit from this feature.

[출처] https://www.percona.com/blog/2014/01/03/multiple-column-index-vs-multiple-indexes-with-mysql-56/






http://code-factory.tistory.com/24

https://d2.naver.com/helloworld/1155

반응형

'Database' 카테고리의 다른 글

[MyBatis] foreach  (0) 2018.05.25
[MySql] DISTINCT , GROUP BY  (1) 2018.05.10
[MySQL] Transaction과 Loack  (0) 2018.03.22
[MySql] ON DUPLICATE KEY UPDATE & VALUES  (0) 2018.03.20
[MyBatis] Transaction  (0) 2017.12.14