작업 범위 결정 조건 : 인덱스 스캔 범위를 결정하는 조건
필터링 조건 : 스캔 범위를 줄이지 못하고 필터 역할만 하는 조건
INDEX ix_test ( column_1, column_2, column_3, ..., column_n )
과 같은 인덱스가 존재할 때 작업 범위 조건으로 인덱스를 사용할 수 있는 조건
column_1
~ column_(i - 1)
칼럼까지 동등 비교 형태('=' 또는 'IN')
로 비교column_i
칼럼에 대해 동등 비교, 부등호 비교, LIKE
좌측 일치 패턴 비교MySQL의 공간 인덱스
지원하는 데이터 타입은 point, line, polygon, geometry
핵심은 MBR(Minimum Bounding Rectangle)
로, 해당 도형을 감싸는 최소 크기의 사각형을 의미
인덱스는 MBR의 포함 관계를 기반으로 B-Tree
형태로 생성됨
ST_Contains()
, ST_Within()
등의 포함 관계 비교 함수로 검색할 때 사용
SELECT * FROM tb_location WHERE ST_Contains(사각 상자, px);
InnoDB의 경우 3072바이트
까지만 잘라서 인덱스 키로 사용
전체 일치
또는 좌측 일부 일치
같은 검색만 가능
전문 검색에는 사용 불가
문서 전체
에 대한 분석과 검색을 위한 인덱싱 기능
불용어 처리 -> 어근 분석
과정을 거쳐 이루어짐
불용어 처리 : 검색에서 별 의미 없는 단어를 필터링하는 작업
어근 분석 : 단어의 원형을 찾는 작업
한글의 경우 어근 분석보다는 형태소를 분석함 (형태소 분석 프로그램인 MeCab
을 사용 가능)
형태소 분석이 제대로 수행되려면 분석 모델을 언어 샘플을 사용해 학습시켜야 하는데, 이 과정에 많은 노력이 필요함
본문을 n 글자
씩 잘라서 인덱싱하는 방법, 보통 2-gram(Bi-gram)
이 많이 사용됨
단순해서 어근 분석 알고리즘보다 범용적으로 적용 가능하지만 인덱스의 크기가 상당히 큰 편
불용어와 일치하거나 불용어를 포함하는 경우 필터링하고 최종 인덱스 등록
다음 두 조건을 갖춰야 전문 검색 인덱스를 사용 가능
(MATCH ... AGAINST ...)
을 사용CPE
를 Latency Bound
아래로 낮추는 또 하나의 방법
하나의 mul
연산만이 loop register
사이의 data dependency
를 이루므로 critical path
를 구성하는 연산의 수가 절반이 되고, minimum possible CPE
도 절반이 됨
k * 1a loop unrolling
도 k * k unrolling
과 비슷한 성능 향상을 만들어 냄
k가 충분히 크면 throughput bound
에 가까운 성능 도달
reassociation
을 통해 연산 순서를 바꾸므로 associative
하지 않은 floating-point addition, multiplication
에 대해서는 동일한 결과가 나오리라는 보장이 없음 -> 컴파일러는 최적화를 수행하지 않음
GCC
는 정수 연산에 대해 reassociation
을 수행하지만, 효과가 항상 좋은 것은 아님
일반적으로 k * k loop unrolling
이 더욱 신뢰성 있는 프로그램 성능 향상을 위한 방법임
SIMD : Single Instruction, Multiple Data
SSE : Streaming SIMD Extensions
AVX : Advanced Vector eXtensions
SIMD execution model은 하나의 명령어로 전체 벡터에 대한 연산을 수행
벡터는 vector register
에 저장되는데, 현대의 AVX 벡터 레지스터는 32바이트 길이를 가짐 (8개의 32비트 숫자, 4개의 64비트 숫자를 저장할 수 있음)
//Multiply Packed Single-Precision Floating-Point Values
vmulps (%rcx), %ymm0, %ymm1