Saya menggunakan indeks seperti yang dilakukan kebanyakan pengembang (kebanyakan pada ... indeks!), Tapi saya yakin ada banyak cara halus untuk mengoptimalkan database menggunakan indeks. Saya tidak yakin apakah ini khusus untuk implementasi DBMS apa pun.
Pertanyaan saya adalah: apa contoh yang baik tentang bagaimana menggunakan indeks (kecuali untuk kasus dasar, jelas), dan bagaimana DBMS mengoptimalkan database ketika Anda menentukan indeks pada tabel?
Jawaban:
Pikirkan indeks sebagai "daftar isi" ... yang merupakan daftar petunjuk pointer ke posisi dalam file, alias offset. Katakanlah Anda memiliki jutaan catatan yang disimpan dalam sebuah tabel, daripada mencari tabel untuk kriteria yang cocok, itu jauh lebih cepat untuk merujuk daftar yang sesuai dengan daftar, kemudian menumpuk pointer ke baris yang cocok. Contoh indeks yang sempurna adalah bidang kunci utama tabel, biasanya bidang "id" -nya. Jika Anda ingin id baris # 11234566, itu jauh lebih cepat meminta indeks untuk pointer ke data daripada memindai sumber data untuk posisi 11234566.
Inilah penggunaan pengindeksan yang tidak begitu jelas:
Operasi Anda dapat membuat catatan log Anda, tetapi kemudian membuat referensi ke waktu indeks yang lebih cepat untuk mencari / mengurutkan dari tabel log Anda. Kemudian gabungkan kembali tabel log Anda dengan kunci utama sendiri. Jika Anda membutuhkan saya untuk memperluas ini, beri tahu saya. Saya harap ini masuk akal.
Permintaan sampel:
sumber
Satu hal yang sepertinya dilewatkan oleh banyak orang adalah bahwa DBMS akan sering (atau hanya dapat) hanya menggunakan satu indeks per tabel referensi dalam kueri, dan jika dapat dan memang menggunakan beberapa indeks, mungkin akan lebih cepat untuk menggunakan gabungan indeks jika ada.
Misalnya, jika mencari tabel besar untuk baris
WHERE AnIntegerColumn = 42 AND AnOtherInt = 69
, rute tercepat ke baris itu akan menjadi indeks pada dua kolom AnIntegerColumn dan AnOtherInt. Jika Anda hanya memiliki indeks pada masing-masing secara individual tetapi tidak ada indeks gabungan, DB akan mencari satu atau yang lain indeks dan secara terpisah menyaring hasil dengan klausa kedua, atau memindai keduanya dan mengawinkan hasilnya setelah itu.Operasi sederhana umum lainnya yang dapat ditingkatkan dengan indeks komposit adalah
WHERE SomeColumn = <SomeValue> ORDER BY SomeOtherColumn
- jika ada indeks pada SomeColumn dan SomeOtherColumn (dalam urutan yang benar) operasi penyaringan dan pemesanan dapat dilakukan pada waktu yang sama dalam beberapa keadaan.Menambahkan terlalu banyak indeks tentu saja bisa menjadi optimasi yang buruk, karena ruang tambahan yang digunakan untuk menyimpan indeks (dan beban-IO untuk mempertahankannya jika DB Anda melihat banyak operasi penulisan) mungkin merupakan masalah yang lebih buruk daripada kueri baca yang sedikit kurang optimal , jadi jangan berlebihan.
sumber
David dan Randy sudah membahas hal ini. Saya hanya ingin menambahkan bahwa para
EXPLAIN
perintah dapat menjadi bantuan besar dalam mencari tahu ketika Anda akan mendapatkan besar penghematan dari membuat indeks, serta menyarankan indeks yang dibutuhkan. Ini akan menampilkan langkah-langkah yang diambil oleh database untuk menjalankan kueri Anda, sehingga Anda tahu bit mana yang paling lama.sumber
Sesuatu yang belum saya lihat disebutkan di sini adalah bahwa ketika Anda memiliki lebih dari satu disk Anda mungkin ingin meletakkan indeks Anda pada disk yang berbeda dari tempat data sebenarnya berada. Ini dapat mempercepat beberapa operasi. Saya pikir ini pantas ditanyakan sendiri.
sumber