Ý nghĩa của bộ lọc trong MySQL giải thích là gì?


21

Như được mô tả ở đây trong các tài liệu MySQL :

Cột được lọc biểu thị tỷ lệ phần trăm ước tính của các hàng trong bảng sẽ được lọc theo điều kiện bảng. Nghĩa là, các hàng hiển thị số lượng hàng ước tính được kiểm tra và các hàng × được lọc / 100 hiển thị số lượng hàng sẽ được nối với các bảng trước đó. Trước MySQL 5.7.3, cột này được hiển thị nếu bạn sử dụng EXPLAIN EXTENDED. Kể từ MySQL 5.7.3, đầu ra mở rộng được bật theo mặc định và từ khóa EXTENDED là không cần thiết.

Tôi vẫn không hiểu. Ý nghĩa của "bộ lọc" ở đây là gì? Thông tin nào chúng ta có thể nhận được từ cột này?

Ví dụ: khi tôi bắt đầu truy vấn, một số truy vấn sẽ hiển thị 100 và một số truy vấn khác hiển thị 18 hoặc bất kỳ thấp hơn 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 |

Điểm chính chúng ta có thể kết luận từ giá trị này là gì?

Có phải nó nói rằng, cột chỉ được lọc 18%? Hoặc nếu điểm càng thấp, chỉ số / truy vấn càng tốt?

Tôi đang sử dụng MySQL 5.7

Câu trả lời:


30

Để lọc ở đây có nghĩa là áp dụng một điều kiện trên một tập hợp các hàng được chọn bởi một typetìm kiếm làm hàng tiềm năng và chỉ giữ các hàng đáp ứng điều kiện:

Trước tiên, MySQL sẽ cố gắng sử dụng một chỉ mục, ví dụ như rangequét trên bảng của bạn abằng cách sử dụng search-key. Nó ước tính để có được 174 hàng sử dụng chỉ mục đó, đó là số trong rows. Bước này chưa được gọi là lọc.

Sau đó, 174 hàng này phải được kiểm tra theo các điều kiện bổ sung (thường là trong phần của bạn where). MySQL hiện ước tính chỉ có 32 hàng, vì vậy 18% trong số 174 hàng này, sẽ vẫn còn sau khi bộ lọc đó được áp dụng. 18% này là giá trị trong filtered.

Mặc dù rõ ràng là tốt hơn khi có 32 hàng thay vì 174 (nếu bạn muốn đặt joinchúng sau đó bằng một bảng khác), một chỉ mục "hoàn hảo" sẽ cung cấp cho bạn 32 hàng này trực tiếp từ tìm kiếm ban đầu, giúp bạn tiết kiệm thời gian để xem và lọc ra 82% của tất cả các hàng tiềm năng.

Vì vậy, giá trị thấp có thể chỉ ra rằng có thể có một chỉ mục tốt hơn: ví dụ: quét toàn bộ bảng rows=1000filtered=0.1%có thể trở thành một tra cứu chỉ mục với rows=1filtered=100%nếu bạn thêm một chỉ mục tốt.

Mặt khác, bạn hoàn toàn có thể bỏ qua giá filteredtrị này (trong hầu hết các trường hợp là một ước tính thực sự tồi tệ) và tập trung vào các cột quan trọng khác (đặc biệt type, keyextra) để tối ưu hóa truy vấn của bạn. Ví dụ, có thể tốt hơn để thoát khỏi filesort(ví dụ: bằng cách sử dụng một chỉ số thỏa mãn order by), ngay cả khi nó dẫn đến filteredgiá trị thấp hơn . Và tốt hơn typecó thể dẫn đến một cải tiến hiệu suất lớn, ngay cả khi nó có thể không thay đổi hoặc thậm chí thấp hơn filtered. Trong ví dụ trên với filtered=0.1%, type=allđã đủ để chỉ ra rằng bạn có thể cải thiện truy vấn đó bằng cách thêm một chỉ mục, mà không cần nhìn filteredvào tất cả.

Vì vậy, đừng quá coi trọng giá trị đó: không có 100nghĩa là chỉ số của bạn tốt, cũng không có giá trị thấp hơn nhất thiết chỉ ra chỉ số xấu. typelà một chỉ số tốt hơn nhiều cho điều đó.


1
Cảm ơn đã giải thích. Nó giải thích rất nhiều cho tôi. Tôi nghĩ nó hữu ích cho việc duy trì và chọn chỉ số tốt
Iman Tumorang

@ImanTumorang Tôi đã thêm một nhận xét và một ví dụ về điều đó: đừng quá coi trọng giá trị đó. Bạn có thể tối ưu hóa truy vấn của mình bằng cách chỉ nhìn typeextra(đó là một nghệ thuật của riêng nó); bạn có thể sống mà không có filtered, nhưng không phải không có type.
Solarflare

Được thôi. Tôi hiểu rồi. Tôi đã đọc nó trong Tài liệu Mysql, cách chúng ảnh hưởng đến hiệu suất. Cảm ơn lời giải thích của bạn: D
Iman Tumorang 16/2/2017

Một mẹo khác: Tính toán được lọc được bỏ qua cho bảng cuối cùng được nối. nghĩa là, nó sẽ hiển thị 100% ngay cả khi trong thực tế có các điều kiện sẽ lọc ra một số hàng được kiểm tra. Lý do là chi phí để ước tính hệ số lọc và điều này sẽ không ảnh hưởng đến kế hoạch thực hiện truy vấn nếu nó nằm trên bảng cuối cùng, vì vậy họ mặc định bỏ qua phép tính.
Bill Karwin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.