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=1000filtered=0.1%함께 인덱스 조회가 될 수 rows=1filtered=100%당신이 좋은 인덱스를 추가하는 경우.

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

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


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

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

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

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