MySQL에서 필터링의 의미는 무엇입니까?


21

MySQL 문서 에서 여기에 설명 된대로 :

필터링 된 열은 테이블 조건에 의해 필터링 될 테이블 행의 예상 백분율을 나타냅니다. 즉, rows는 검사 된 예상 행 수를 표시하고 rows × filtering / 100은 이전 테이블과 결합 될 행 수를 표시합니다. MySQL 5.7.3 이전에 EXPLAIN EXTENDED를 사용하면이 열이 표시됩니다. MySQL 5.7.3부터 확장 출력은 기본적으로 활성화되어 있으며 EXTENDED 키워드는 필요하지 않습니다.

나는 아직도 그것을 얻지 못한다. 여기서 "필터링 된"의 의미는 무엇입니까? 이 칼럼에서 어떤 정보를 얻을 수 있습니까?

예를 들어, 쿼리를 시작하면 일부 쿼리에 100이 표시되고 다른 쿼리에 18 또는 100보다 작은 것이 표시됩니다.

+-------------+-------+--------+---------+---------+------+----------+
| select_type | table | type   | key     | key_len | rows | filtered |
+-------------+-------+--------+---------+---------+------+----------+
| PRIMARY     | a     | range  | search  | 4       |  174 |   18.00  | <--
| PRIMARY     | b     | eq_ref | PRIMARY | 4       |    1 |   100.00 |
| PRIMARY     | c     | ALL    | PRIMARY | 4       |    1 |   100.00 |

이 가치에서 결론을 내릴 수있는 요점은 무엇입니까?

열이 18 % 만 필터링 되었습니까? 또는 점수가 낮을수록 인덱스 / 쿼리가 더 좋습니까?

MySQL 5.7을 사용하고 있습니다

답변:


30

여기서 필터링 한다는 것은 type-search에 의해 선택된 행 집합에 조건을 적용하고 조건 을 충족하는 행만 유지하는 것을 의미합니다.

MySQL은 먼저 인덱스를 사용하려고합니다. 예를 들어 -key를 사용 range하여 테이블 a을 스캔합니다 search. 해당 인덱스를 사용하여 174 개의 행을 가져 오는 것으로 추정됩니다 rows. 이 단계를 아직 필터링이라고합니다.

그 후,이 174 개의 행은 추가 조건 (보통 where-clause) 에 대해 점검해야합니다 . MySQL은 이제 32 개의 행만, 따라서이 174 개의 행 중 18 %는 해당 필터가 적용된 후에도 남아있을 것으로 추정했습니다. 이 18 %는의 값입니다 filtered.

174 대신 32 개의 행을 갖는 것이 더 낫지 만 (예를 들어 join다른 테이블 에서 나중에 행해야하는 경우 ), "완벽한"인덱스는 초기 검색에서이 32 개의 행을 직접 제공하여 볼 시간을 절약합니다. 모든 잠재적 행의 82 %를 걸러냅니다.

로 예를 들어, 전체 테이블 스캔 : 낮은 값이 더 좋은 지표가 될 수 있음을 나타낼 수 있습니다 그래서 rows=1000와 filtered=0.1%함께 인덱스 조회가 될 수 rows=1및 filtered=100%당신이 좋은 인덱스를 추가하는 경우.

반면에,이 filtered값 (대부분의 경우 실제로 나쁜 추정값 임)을 완전히 무시 하고 쿼리를 최적화하기 위해 다른 더 중요한 열 (특히 type, key및 extra)에 초점을 맞출 수 있습니다. 예를 들어 값을 낮추 더라도을 제거하는 것이 더 좋습니다 filesort(예 :을 만족하는 색인을 사용하여 order by) filtered. 더 좋을수록 type변경되지 않거나 더 낮아도 성능이 크게 향상 될 수 있습니다 filtered. 예에서와 위 filtered=0.1%, type=all이미 보지 않고, 인덱스를 추가하여 해당 쿼리를 향상시킬 수 있습니다 나타 내기 위해 충분 한 것 filtered모두에서.

따라서이 값을 너무 진지하게 고려하지 100마십시오. 인덱스가 양호하다는 의미는 아니며 낮은 값이 반드시 잘못된 인덱스를 나타내는 것은 아닙니다. type훨씬 더 좋은 지표입니다.


1
설명해 주셔서 감사합니다. 그것은 나를 위해 많은 설명입니다. 나는 그것을 유지하고 좋은 인덱스를 선택하는 데 유용하다고 생각
— 이만 Tumorang을

@ImanTumorang 나는 그것에 대해 언급하고 그에 대한 예를 추가했습니다. 그 가치를 너무 심각하게 생각하지 마십시오. 당신은보고 쿼리를 최적화 할 수 있습니다 type및 extra(그 자체로 예술이되는); 당신은 없이는 살 수 filtered있지만, 없이는 살 수 없습니다 type.
— Solarflare

그럼 알았어 나는 이미 Mysql Docs에서 성능에 어떤 영향을 미치는지 읽었습니다. D : 당신의 설명을 주셔서 감사합니다
— 이만 Tumorang

또 다른 팁 : 마지막으로 결합 된 테이블에 대해 필터링 된 계산을 건너 뜁니다. 즉, 실제로 검사 된 일부 행을 필터링하는 조건이 있어도 100 %로 표시됩니다. 이론적 근거는 필터링 계수를 추정하는 데 비용이 들며 이는 마지막 테이블에있는 경우 쿼리 실행 계획에 영향을 미치지 않으므로 기본적으로 계산을 건너 뛰는 것입니다.
— Bill Karwin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.