Mengindeks database


12

Saya tidak begitu terbiasa dengan database dan sekarang saya mencoba memahami mekanisme pengindeksan.

Dari yang saya tahu, dalam RDBMS, pengindeksan pada kolom membuat pencarian dengan kolom itu lebih cepat. Ini juga berlaku untuk tiga toko, hanya ada indeks yang menganggap Anda akan mencari (misalnya) sebagian besar berdasarkan subjek, kemudian oleh objek dan sebagainya.

Saya tidak yakin tentang RDBMS, tetapi di tiga toko Anda dapat menentukan lebih dari satu indeks, membiarkan toko memilih indeks terbaik untuk setiap permintaan (mudah-mudahan saya mengerti ini dengan benar). Secara alami, pertanyaan berikut muncul:

Mengapa saya tidak harus menambahkan semua indeks yang mungkin ke tiga toko, dan memperluas ke RDBMS, mengapa tidak membuat indeks pada setiap kolom (dengan asumsi saya tidak terlalu malas)?

Jawaban:


25

Karena, pada dasarnya, indeks adalah tabel tambahan, di mana kunci utama adalah bidang yang Anda indeks dan satu-satunya konten adalah kunci utama dari tabel utama Anda. Jadi setiap pembaruan harus direplikasi di setiap indeks yang menggunakan bidang yang Anda perbarui.

Ini terutama terlihat pada Sisipan. Bayangkan jika setiap insert yang Anda lakukan pada sebuah tabel harus direplikasi pada 20 tabel lainnya. Ini akan sangat lambat.

Perhatikan bahwa ini semakin buruk dengan indeks gabungan, berkerumun, dan teks lengkap, tetapi saya belum ingin mempersulit masalah Anda.


2

Indeks pada dasarnya adalah struktur data tambahan yang harus dibangun dan disimpan. Membangun inde buang daya CPU (selama operasi penulisan) dan menyimpannya membuang kapasitas disk

Mengapa Anda ingin membuat dan menyimpan indeks yang tidak pernah Anda gunakan?


Ini adalah pertanyaan yang murni teoretis ("bagaimana jika / mengapa tidak").
Dragos

@ Dragos Saya pikir jawaban atas pertanyaan-pertanyaan itu jelas dari posting saya: Jika Anda melakukannya, setiap operasi penulisan akan menjadi jauh lebih lambat dan setiap catatan akan menghabiskan banyak kapasitas disk. Kenapa tidak? Karena daya CPU dan penyimpanan disk mahal.
Matěj Zábský

2

Hanya tempatkan indeks saat dibutuhkan. Sebagai aturan praktis ketika saya mengembangkan skema database, setiap tabel mendapatkan Indeks Primer Kunci Utama PK untuk memulai. Ini akan menjadi pengidentifikasi unik untuk data dalam tabel itu. Bisa di 1 kolom atau banyak.

Setelah itu, saya biasanya hanya menambahkan Indeks Unik Non-Clustered pada kolom yang ingin saya tegakkan keunikannya.

Ini adalah skema dasar. Saat aplikasi dikembangkan dan matang, kami menambahkan indeks sesuai kebutuhan berdasarkan kekhawatiran kinerja dan bagaimana kami meminta data.

Setiap peningkatan indeks ditambahkan spasi yang digunakan serta menambahkan tambahan pemeliharaan. Jadi pilih indeks Anda dengan bijak.


Saat membaca jawaban Anda, pertanyaan lain muncul di benak saya: Apakah Primary Key biasanya diindeks secara otomatis, atau apakah saya harus menentukan sendiri bahwa mereka akan diindeks? Katakanlah, misalnya, dalam database MySQL?
Dragos

Ya, kunci utama harus membuat indeks berkerumun secara otomatis untuk (SQL Server) Anda. Hanya satu kunci utama, sehingga hanya satu indeks berkerumun per tabel. MySQL harus serupa tetapi mungkin seorang ahli MySQL dapat memvalidasi.
Jon Raynor

2

Kekuatan Indeks adalah bahwa mereka adalah 1) struktur data yang dapat dengan cepat dicari melalui dan 2) lebih kompak dari tabel sebenarnya, memungkinkan lebih banyak indeks untuk masuk ke dalam memori daripada dipindahkan ke disk.

Jika Anda memiliki indeks pada setiap kolom, maka indeks itu sendiri akan mengambil lebih banyak ruang daripada tabel yang mereka wakili. Jika database benar-benar menggunakan semua indeks, itu akan membutuhkan lebih banyak waktu hanya untuk menukar mereka masuk dan keluar dari memori. Selain itu, setiap indeks harus diperbarui pada lembam, memperbarui, atau menghapus.

Selain itu, indeks pada satu kolom bahkan bukan yang terbaik yang dapat Anda lakukan. Kebanyakan database relasi sebenarnya memungkinkan indeks pada banyak kolom, dan urutan kolom ini penting. Misalnya, jika saya ingin mencari basis data untuk semua orang yang pergi ke Duke dari kelas antara 1980 dan 1984, maka yang saya inginkan adalah indeks pada (Sekolah, Kelas Tahun). Kueri tidak akan dapat menggunakan indeks dengan kolom yang sama, tetapi dibalik.

Jadi untuk membuat setiap indeks yang mungkin, setidaknya ada n! cara mengatur kolom dalam indeks. Dengan hanya 5 kolom, ada 120 kemungkinan indeks.

Karena ada banyak kemungkinan indeks, Anda benar-benar harus menentukan indeks apa yang berguna untuk aplikasi Anda dan hanya membuat itu.


Tetapi apakah dalam contoh Anda dua indeks: satu di Sekolah dan yang lainnya di ClassYear berguna dalam kasus apa pun?
Dragos

@Dragos Tentu, mereka bisa. Jika saya memiliki pertanyaan lain yang hanya melebihi Tahun Kelas (semua siswa yang bersekolah di kelas tahun 2004) maka indeks Tahun Kelas mungkin berguna. Sayangnya, ada banyak faktor yang digunakan mesin kueri saat memutuskan indeks apa yang akan digunakan. Jika ternyata separuh dari orang dalam basis data memang bersekolah pada tahun 2004, maka basis data mungkin mengabaikan indeks dan memindai seluruh tabel. Jika Anda ingin menjadi ahli dalam hal ini, mulailah menggunakan dan membaca rencana eksekusi
Chris Pitman

Apa yang saya maksudkan adalah, Jika saya memiliki indeks terpisah di Sekolah dan ClssYear, apakah akan berguna ketika mencari semua orang yang pergi ke Duke dari kelas antara 1980 dan 1984?
Dragos

@Dragos Tergantung pada mesin db tertentu. Sebagai contoh, Postgres akan menggunakan sesuatu yang disebut Pemindaian Indeks Bitmap untuk memotong hasil dari beberapa indeks. Terserah mesin permintaan untuk memutuskan indeks mana yang akan digunakan, dan ini akan selalu spesifik db.
Chris Pitman

2

Membuat indeks untuk setiap kolom dalam sebuah tabel biasanya merupakan pemborosan ruang, dan seperti yang telah disebutkan, hal itu dapat memperlambat operasi penyisipan / pembaruan. Indeks digunakan untuk mempercepat kueri. Saya hanya merekomendasikan menambahkan indeks ke kolom jika Anda melihat kinerja yang buruk ketika meminta nilai dalam kolom itu.

Beberapa database mungkin memerlukan indeks untuk kunci utama tabel sehingga Anda mungkin tidak punya pilihan tentang itu. Juga, jika Anda memiliki kolom teks yang sangat besar, ada teknologi spesifik yang dirancang untuk pencarian dan indeks teks lengkap, tetapi mereka tidak selalu sama dengan indeks yang akan Anda gunakan untuk kolom numerik kecil.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.