pengembangan-web-mp.com

Apakah ada keuntungan kinerja dalam pengindeksan bidang boolean?

Saya baru saja akan menulis kueri yang menyertakan WHERE isok=1. Sesuai namanya, isok adalah bidang boolean (sebenarnya TINYINT(1) UNSIGNED yang diset ke 0 atau 1 sesuai kebutuhan).

Apakah ada keuntungan kinerja dalam pengindeksan bidang ini? Apakah mesin (InnoDB dalam kasus ini) berkinerja lebih baik atau lebih buruk mencari indeks?

83

Tidak juga. Anda harus memikirkannya seperti buku. Jika hanya ada 3 jenis kata dalam sebuah buku dan Anda mengindeks semuanya, Anda akan memiliki jumlah halaman indeks yang sama dengan halaman normal.

Akan ada peningkatan kinerja jika hanya ada sedikit catatan satu nilai. Misalnya, jika Anda memiliki 1000 catatan dan 10 di antaranya BENAR, maka akan berguna jika Anda mencari dengan isok = 1

Seperti yang disebutkan Michael Durrant, itu juga membuat menulis lebih lambat.

EDIT: Kemungkinan duplikasi: Pengindeksan bidang boolean

Di sini dijelaskan bahwa meskipun Anda memiliki indeks, jika Anda memiliki terlalu banyak catatan, itu tidak menggunakan indeks. MySQL tidak menggunakan indeks saat memeriksa = 1, tetapi menggunakannya dengan =

60
Michael Koper

Hanya untuk menempatkan poin yang lebih baik pada beberapa jawaban lain di sini, karena dalam pengalaman saya, mereka yang melihat pertanyaan seperti ini berada di kapal yang sama dengan kami, kita semua telah mendengar bahwa pengindeksan bidang Boolean tidak ada gunanya, namun ...

Kami memiliki meja dengan sekitar 4 juta baris, hanya sekitar 1000 atau lebih pada suatu waktu akan memiliki boolean switch ditandai dan itulah yang kami cari. Menambahkan indeks pada bidang Boolean kami mempercepat kueri berdasarkan urutan besarnya, ia beralih dari sekitar 9+ detik menjadi sepersekian detik.

89
oucil

Itu tergantung pada permintaan aktual dan selektivitas dari kombinasi indeks/permintaan.

Kasus A: kondisi WHERE isok = 1 dan tidak ada yang lain di sana:

SELECT *
FROM tableX
WHERE isok = 1
  • Jika indeksnya cukup selektif (misalkan Anda memiliki baris 1M dan hanya 1k yang memiliki isok = 1), maka mesin SQL mungkin akan menggunakan indeks dan lebih cepat daripada tanpanya.

  • Jika indeksnya tidak cukup selektif (misalkan Anda memiliki baris 1M dan lebih dari 100r memiliki isok = 1), maka mesin SQL mungkin akan tidak menggunakan indeks dan melakukan pemindaian tabel.

Kasus B: kondisi WHERE isok = 1 dan banyak lagi:

SELECT *
FROM tableX
WHERE isok = 1
  AND another_column = 17

Kemudian, itu tergantung pada indeks apa yang Anda miliki. Indeks pada another_column mungkin akan lebih selektif daripada indeks pada isok yang hanya memiliki dua nilai yang mungkin. Indeks pada (another_column, isok) atau (isok, another_column) akan lebih baik.

22
ypercubeᵀᴹ

Tidak, biasanya tidak.

Anda biasanya mengindeks bidang untuk pencarian ketika mereka memiliki selektivitas/kardinalitas tinggi. Kardinalitas bidang boolean sangat rendah di sebagian besar tabel. Ini juga akan membuat penulisan Anda lebih lambat.

6
Michael Durrant

Ya, indeks akan meningkatkan kinerja, periksa output EXPLAIN dengan dan tanpa indeks.

Dari dokumen:

Indeks digunakan untuk menemukan baris dengan nilai kolom spesifik dengan cepat. Tanpa indeks, MySQL harus memulai dengan baris pertama dan kemudian membaca seluruh tabel untuk menemukan baris yang relevan. Semakin besar tabel, semakin banyak biaya ini. Jika tabel memiliki indeks untuk kolom yang dimaksud, MySQL dapat dengan cepat menentukan posisi yang dicari di tengah file data tanpa harus melihat semua data.

Saya pikir aman juga untuk mengatakan indeks tidak akan MENURUN kinerja dalam kasus ini, jadi Anda hanya perlu mendapatkan dari itu.

4
ilanco

Itu tergantung pada distribusi data.

Bayangkan saya memiliki buku dengan 1000 halaman yang diketik dengan seksama, dan satu-satunya kata dalam buku saya adalah 'ya' dan 'tidak' berulang-ulang dan didistribusikan secara acak. Jika saya diminta untuk melingkari semua contoh 'ya', apakah indeks di belakang buku akan membantu? Tergantung.

Jika ada distribusi acak setengah dan setengah dari ya dan tidak, maka mencari di indeks tidak akan membantu. Indeks akan membuat buku jauh lebih besar, dan lagi pula saya akan lebih cepat hanya untuk memulai dari depan dan bekerja melalui setiap halaman mencari semua contoh 'ya' dan melingkari mereka, daripada mencari setiap item dalam indeks dan kemudian mengambil referensi dari entri indeks ke halaman yang dimaksud.

Tetapi jika ada, katakanlah, hanya sepuluh contoh 'ya' dalam buku seribu halaman saya dan yang lainnya hanya jutaan tidak, maka indeks akan menghemat banyak waktu saya dalam menemukan sepuluh contoh 'ya' dan melingkari mereka .

Itu sama di database. Jika distribusi 50:50, maka indeks tidak akan membantu - mesin database lebih baik hanya membajak data dari awal hingga selesai (pemindaian tabel penuh), dan indeks hanya akan membuat database lebih besar, dan lebih lambat untuk menulis dan memperbarui. Tetapi jika itu adalah sesuatu seperti distribusi 4000: 1 (sesuai oucil di utas ini), maka pencarian indeks dapat mempercepatnya, jika itu adalah 1 dari 4000 item yang Anda cari .

4
Jinlye

Sebenarnya ini tergantung pada kueri yang Anda jalankan. Tapi, umumnya ya, juga mengindeks bidang dari jenis lainnya.

3
Maksym Polshcha