제한
- 파티션 테이블에서는 지원 불가
- 기본값 on , 다이나믹 적용 가능, 글로벌, 세션레벨 적용가능 (optimizer_switch rowid_filter의 변수)
- rowid 필터링은 desc 인덱스 스캔과 같이 사용할 수 없음 ( 옵티마이저가 order by ~ desc 쿼리를 실행하면 rowid 가 비활성화됨)
Rowid 필터링의 대상 사용 사례
테이블은 인덱스 IDX1에 대한 참조 액세스를 사용합니다.
다른 인덱스 IDX2에는 상당히 제한적인 범위 조건자가 있습니다.
위의 경우 아래 방식으로 유리합니다.
인덱스 IDX2에 대해 인덱스 스캔을 수행하고, 인덱스 레코드의 rowid를 필터링할 수 있는 데이터 구조($FILTER라고 부르겠습니다)에 수집합니다.
IDX1에 대해 ref 접근을 할 때, 전체 레코드를 읽기 전에 $FILTER를 확인합니다.
예시 쿼리문
SELECT ...
FROM orders JOIN lineitem ON o_orderkey=l_orderkey
WHERE
l_shipdate BETWEEN '1997-01-01' AND '1997-01-31' AND
o_totalprice between 200000 and 230000;
- l_shipdate에 대한 조건이 매우 제한적일 경우, 옵티마이저는 lineitem 테이블을 먼저 처리하는 것이 더 효율적이라고 판단할 수 있습니다.
- 그 후 o_orderkey = l_orderkey 조건을 사용해 인덱스 검색을 통해 두 테이블을 조인합니다.
- 또한 o_totalprice에 대한 조건도 선택적이기 때문에, 결과를 더 좁힐 수 있습니다.
플랜
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: lineitem
type: range
possible_keys: PRIMARY,i_l_shipdate,i_l_orderkey,i_l_orderkey_quantity
key: i_l_shipdate
key_len: 4
ref: NULL
rows: 98
Extra: Using index condition
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: orders
type: eq_ref|filter
possible_keys: PRIMARY,i_o_totalprice
key: PRIMARY|i_o_totalprice
key_len: 4|9
ref: dbt3_s001.lineitem.l_orderkey
rows: 1 (5%)
Extra: Using where; Using rowid filter
- orders 테이블은 rowid 필터를 사용하여 필요한 행만 읽습니다.
- type 열에 **"|filter"**가 표시되어, 필터링이 적용됨을 나타냅니다.
- key 열은 필터를 생성하는 데 사용된 인덱스를 보여줍니다.
- rows 열은 필터가 선택할 행의 비율을 보여주며, 이 경우 전체 데이터 중 **5%**만 필터링될 것으로 예상됩니다.
출처 - https://mariadb.com/kb/en/rowid-filtering-optimization/
'Mysql & Maria > admin' 카테고리의 다른 글
percona toolkit 설치 (0) | 2024.09.14 |
---|---|
centos 7, mysql 5.7 설치 (1) | 2024.09.14 |
MySQL의 복제 지연을 줄이기 위한 전략 (0) | 2024.08.27 |
MySQL에서 하지말아야 할 것들 (0) | 2024.08.26 |
ip 저장시 inet_aton 함수 사용 (0) | 2024.08.26 |