Saya baru saja akan menulis kueri yang menyertakan WHERE isok=1
. Sesuai dengan namanya, isok
adalah bidang boolean (sebenarnya TINYINT(1) UNSIGNED
yang disetel ke 0 atau 1 sesuai kebutuhan).
Apakah ada peningkatan kinerja dalam mengindeks bidang ini? Akankah mesin (InnoDB dalam kasus ini) berkinerja lebih baik atau lebih buruk saat mencari indeks?
Jawaban:
Tidak juga. Anda harus memikirkannya seperti sebuah buku. Jika hanya ada 3 jenis kata dalam sebuah buku dan Anda mengindeks semuanya, Anda akan memiliki jumlah halaman indeks yang sama dengan halaman biasa.
Akan ada peningkatan kinerja jika hanya ada sedikit catatan dengan satu nilai. Misalnya, jika Anda memiliki 1000 record dan 10 di antaranya BENAR, maka akan berguna jika Anda mencari dengan
isok = 1
Seperti yang disebutkan Michael Durrant, ini juga membuat penulisan menjadi lebih lambat.
EDIT: Kemungkinan duplikasi: Mengindeks bidang boolean
Di sini dijelaskan bahwa meskipun Anda memiliki indeks, jika Anda memiliki terlalu banyak catatan, ia tidak menggunakan indeks. MySQL tidak menggunakan indeks saat memeriksa = 1, tetapi menggunakannya dengan = 0
sumber
Hanya untuk memberikan poin yang lebih baik pada beberapa jawaban lain di sini, karena menurut pengalaman saya, mereka yang melihat pertanyaan seperti ini berada di perahu yang sama dengan kita, kita semua pernah mendengar bahwa mengindeks bidang Boolean tidak ada gunanya, namun ...
Kami memiliki tabel dengan sekitar 4 juta baris, hanya sekitar 1000 atau lebih pada satu waktu sakelar Boolean ditandai dan itulah yang kami telusuri. Menambahkan indeks pada bidang Boolean kami mempercepat kueri berdasarkan urutan besarnya, dari sekitar 9+ detik menjadi sepersekian detik.
sumber
WHERE my_col > 0
bukannyamy_col = 1
juga tampaknya membantu kecepatanItu tergantung pada kueri aktual dan selektivitas kombinasi indeks / kueri.
Kasus A : kondisi
WHERE isok = 1
dan tidak ada yang lain di sana:Jika indeks cukup selektif (katakanlah Anda memiliki 1 juta baris dan hanya 1k yang memilikinya
isok = 1
), maka mesin SQL mungkin akan menggunakan indeks dan menjadi lebih cepat daripada tanpa itu.Jika indeks tidak cukup selektif (katakanlah Anda memiliki 1 juta baris dan lebih dari 100k memilikinya
isok = 1
), maka mesin SQL mungkin tidak akan menggunakan indeks dan melakukan pemindaian tabel.Kasus B : kondisi
WHERE isok = 1
dan lebih banyak barang:Kemudian, itu tergantung pada indeks lain yang Anda miliki. Indeks pada
another_column
mungkin akan lebih selektif daripada indeksisok
yang hanya memiliki dua kemungkinan nilai. Indeks(another_column, isok)
atau(isok, another_column)
bahkan lebih baik.sumber
Itu tergantung pada distribusi datanya.
Bayangkan saya memiliki sebuah buku dengan 1000 halaman yang diketik dengan cermat, dan satu-satunya kata dalam buku saya adalah 'ya' dan 'tidak' yang diulang berulang-ulang dan didistribusikan secara acak. Jika saya diminta untuk melingkari semua contoh 'ya', apakah indeks di belakang buku membantu? Tergantung.
Jika ada distribusi acak setengah-setengah dari ya dan tidak, mencari di indeks tidak akan membantu. Indeks akan membuat buku jauh lebih besar, dan bagaimanapun saya akan lebih cepat memulai dari depan dan menelusuri setiap halaman mencari semua contoh 'ya' dan memutarnya, daripada mencari setiap item di indeks dan kemudian mengambil referensi dari entri indeks ke halaman yang diacunya.
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 untuk menemukan sepuluh contoh 'ya' dan memutarnya .
Itu sama di database. Jika itu adalah distribusi 50:50, maka indeks tidak akan membantu - mesin database lebih baik hanya membajak data dari awal hingga akhir (pemindaian tabel lengkap), 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 sangat, jika 1 dari 4000 item yang Anda cari.
sumber
Tidak, biasanya tidak.
Anda biasanya mengindeks bidang untuk mencari ketika mereka memiliki selektivitas / kardinalitas tinggi. Kardinalitas bidang boolean sangat rendah di sebagian besar tabel. Ini juga akan membuat penulisan Anda sedikit lebih lambat.
sumber
Sebenarnya ini tergantung pada kueri yang Anda jalankan. Tapi, umumnya ya, serta mengindeks bidang jenis lainnya.
sumber
Ya indeks akan meningkatkan kinerja, periksa keluaran JELASKAN dengan dan tanpa indeks.
Dari dokumen:
Menurut saya juga aman untuk mengatakan indeks tidak akan MENURUNKAN kinerja dalam kasus ini, jadi Anda hanya perlu mendapatkan keuntungan darinya.
sumber
TINYINT(1) UNSIGNED
kolom, ukuran datanya akan kecil.