Apa arti dari filter yang dijelaskan di MySQL?

21

Seperti yang dijelaskan di sini dalam dokumen MySQL :

Kolom yang difilter menunjukkan perkiraan persentase baris tabel yang akan difilter menurut kondisi tabel. Artinya, baris menunjukkan perkiraan jumlah baris yang diperiksa dan baris × yang difilter / 100 menunjukkan jumlah baris yang akan digabungkan dengan tabel sebelumnya. Sebelum MySQL 5.7.3, kolom ini ditampilkan jika Anda menggunakan EXPLAIN EXTENDED. Pada MySQL 5.7.3, output diperpanjang diaktifkan secara default dan kata kunci DIPERPANJANG tidak perlu.

Saya masih belum mengerti. Apa arti dari "disaring" di sini? Informasi apa yang bisa kita dapatkan dari kolom ini?

Misalnya, ketika saya mulai melakukan kueri, beberapa permintaan akan menampilkan 100, dan beberapa lainnya menampilkan 18 atau lebih rendah dari 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 |

Apa poin utama yang bisa kita simpulkan dari nilai ini?

Apakah dikatakan bahwa, kolom hanya menyaring 18%? Atau jika semakin rendah nilainya, semakin bagus indeks / kueri?

Saya menggunakan MySQL 5.7

Iman Tumorang
sumber

Jawaban:

30

Untuk memfilter di sini berarti menerapkan kondisi pada serangkaian baris yang dipilih oleh type-sebagai baris potensial, dan hanya menyimpan baris yang memenuhi syarat:

MySQL pertama-tama akan mencoba menggunakan indeks, mis. Lakukan rangepemindaian di meja Anda amenggunakan search-kunci. Diperkirakan untuk mendapatkan 174 baris dari menggunakan indeks itu, yang merupakan angka dalam rows. Langkah ini belum disebut penyaringan.

Setelah itu, 174 baris ini harus diperiksa dengan kondisi tambahan (biasanya di where-klik Anda ). MySQL sekarang memperkirakan bahwa hanya 32 baris, jadi 18% dari 174 baris ini, akan tetap ada setelah filter diterapkan. 18% ini adalah nilai dalam filtered.

Meskipun jelas lebih baik untuk memiliki 32 baris daripada 174 (jika Anda misalnya harus kemudian joindengan tabel lain), indeks "sempurna" akan memberi Anda 32 baris ini langsung dari pencarian awal, menghemat waktu Anda untuk melihat dan menyaring 82% dari semua baris potensial.

Jadi nilai yang rendah mungkin mengindikasikan bahwa mungkin ada indeks yang lebih baik: mis. Pemindaian tabel penuh dengan rows=1000dan filtered=0.1%bisa menjadi pencarian indeks dengan rows=1dan filtered=100%jika Anda menambahkan indeks yang baik.

Di sisi lain, Anda dapat sepenuhnya mengabaikan nilai-ini filtered(yang dalam kebanyakan kasus merupakan perkiraan yang sangat buruk), dan fokus pada kolom lain yang lebih penting (terutama type, keydan extra) untuk mengoptimalkan kueri Anda. Misalnya bisa lebih baik untuk menyingkirkan filesort(misalnya dengan menggunakan indeks yang memenuhi order by), bahkan jika itu menghasilkan filterednilai yang lebih rendah . Dan yang lebih baik typedapat menghasilkan peningkatan kinerja yang sangat besar, bahkan jika itu tidak berubah atau bahkan lebih rendah filtered. Pada contoh di atas dengan filtered=0.1%, type=allsudah cukup untuk menunjukkan bahwa Anda mungkin dapat meningkatkan kueri itu dengan menambahkan indeks, tanpa melihat filteredsama sekali.

Jadi jangan menganggap nilai itu terlalu serius: tidak 100berarti indeks Anda baik, juga tidak nilai yang lebih rendah menunjukkan indeks buruk. typeadalah indikator yang jauh lebih baik untuk itu.

Solarflare
sumber
1
Terima kasih atas penjelasannya. Ini menjelaskan banyak hal untuk saya. Saya pikir ini berguna untuk menjaga dan memilih indeks yang baik
Iman Tumorang
@ImanTumorang Saya menambahkan komentar dan contoh tentang itu: jangan menganggap nilai itu terlalu serius. Anda dapat mengoptimalkan kueri Anda hanya dengan melihat typedan extra(yang merupakan karya seni sendiri); Anda bisa hidup tanpa filtered, tetapi bukan tanpa type.
Solarflare
Baiklah kalau begitu. Saya mendapatkannya. Saya sudah membacanya di Dokumen Mysql, bagaimana pengaruhnya terhadap kinerja. Terima kasih atas penjelasan Anda: D
Iman Tumorang
Kiat lain: Perhitungan yang difilter dilewati untuk tabel terakhir yang digabungkan. yaitu, ia akan menampilkan 100% bahkan jika ada kondisi sebenarnya yang akan menyaring beberapa baris yang diperiksa. Alasannya adalah bahwa biaya sesuatu untuk memperkirakan faktor penyaringan, dan ini tidak akan mempengaruhi rencana eksekusi permintaan jika ada di tabel terakhir, jadi mereka default untuk melewatkan perhitungan.
Bill Karwin