Sebagian besar dari kita mungkin akan setuju bahwa menggunakan indeks basis data itu baik. Terlalu banyak indeks dan kinerja dapat benar-benar terdegradasi.
Sebagai aturan umum, bidang mana yang harus diindeks?
Bidang mana yang tidak boleh diindeks?
Apa aturan untuk menggunakan indeks sambil mencapai keseimbangan antara terlalu banyak dan tidak cukup indeks untuk mencapai peningkatan kinerja, bukan degradasi?
Jawaban:
Pendek
Aturan "terlalu banyak indeks" agak menyesatkan menurut saya.
Panjang
Mengingat bahwa rata-rata basis data sekitar 98% bacaan (atau lebih tinggi) bacaan perlu dioptimalkan. INSERT adalah bacaan jika ada indeks unik, misalnya. Atau DI MANA pada pembaruan. Saya pernah membaca bahwa bahkan database menulis intensif masih membaca 85%.
Apa yang Anda miliki adalah pengindeksan berkualitas buruk. Contoh:
cold, cole
dancold, cole, colf)
Perhatikan bahwa cukup umum untuk memiliki indeks beberapa kali lebih besar dari data Anda yang sebenarnya bahkan dalam sistem OLTP.
Secara umum, saya akan mulai dengan
Lalu saya akan melihat:
Mengatakan itu, saya telah melanggar aturan ini untuk beberapa sistem setelah melihat bagaimana segala sesuatunya berjalan lancar (10 miliar baris kemudian) untuk menyempurnakan suatu sistem. Tetapi saya tidak akan pernah mempertimbangkan untuk tidak mengindeks kecuali saya dapat menunjukkan mengapa saya melakukannya.
sumber
Anda harus membuat profil penggunaan dan pemuatan basis data Anda, dan mengidentifikasi kemacetan karena indeks yang hilang - atau karena terlalu banyak indeks. Maka Anda harus memilih indeks yang tepat - dan yang membutuhkan pengetahuan yang baik tentang teknik pengindeksan database tertentu.
sumber
Cukup sederhana salah satu seri artikel terbaik yang ditulis pada indeks mana yang harus dipilih dan mengapa oleh Gail Shaw. Anda dapat menemukan artikel dengan mengklik di sini
Pertanyaan yang Anda ajukan dapat dijawab 50 cara berbeda. Itu benar-benar semua bermuara pada data yang Anda miliki dan bagaimana hal itu akan ditanyakan. Aturan umum adalah bahwa Anda harus selalu memiliki indeks berkerumun di setiap tabel untuk menghindari tumpukan. Indeks yang dikelompokkan biasanya harus sekecil mungkin. Jika tabel memiliki indeks berkerumun maka semua catatan indeks pada halaman daun indeks non-berkerumun akan menyimpan nilai catatan indeks berkerumun masing-masing untuk pencarian bookmark. Jika tabel tumpukan, SQL akan membuat pengidentifikasi unik untuk pencarian bookmark. Saya tidak ingat ukurannya 8 atau 16 byte. Ini bisa berakhir menjadi tipe data yang jauh lebih besar kemudian mengatakan INT. Bayangkan memiliki 8 indeks non-cluster di atas heap table.
sumber
Saya ingin menambahkan di sini bahwa basis data yang berbeda memerlukan strategi yang berbeda. Mari kita bandingkan MySQL w / InnoDB dan PostgreSQL sebagai contoh.
InnoDB
Tabel InnoDB pada dasarnya adalah indeks b-tree dari kunci utama yang diperluas untuk memasukkan informasi baris dalam entri indeks. Pemindaian urutan fisik tidak didukung dan semua pemindaian terjadi dalam urutan logis. Ini berarti dua hal:
Pemindaian berurutan di Innodb menghasilkan banyak I / O disk acak , dan
Indeks kunci utama harus dilalui terlepas dari apakah seseorang menggunakan indeks sekunder.
Pencarian kunci primer lebih cepat dalam model ini daripada dalam pendekatan lainnya.
Dalam hal ini sangat penting untuk mengindeks bidang yang cukup dalam tabel multi-halaman. Aturan umumnya adalah indeks semua yang ingin Anda filter.
PostgreSQL
PostgreSQL menggunakan file tumpukan, satu tabel per file (beberapa tabel mungkin banyak file) di mana tupel dialokasikan dari ruang kosong tumpukan itu. Pemindaian urutan fisik didukung. Agar pemindaian urutan logis berfungsi, indeks harus ditambahkan.
Kunci primer di PostgreSQL pada dasarnya adalah bagian dari indeks unik di mana tidak ada nilai yang NULL. Kendala UNIK dilakukan dengan menggunakan indeks implisit, dan beberapa jenis indeks lainnya didukung dengan operasi yang berbeda yang mungkin dalam indeks.
Ini berarti:
Pencarian kunci primer, dengan asumsi tablerequire cukup besar memukul file indeks dan file tabel. Ini secara signifikan lebih lambat daripada pendekatan MySQL di mana indeks hanya harus dilalui dan baris terkandung dalam indeks.
Pemindaian urutan fisik berkinerja lebih baik, mengurangi I / O disk acak tempat sejumlah besar baris akan diproses.
Pemindaian indeks sekunder berkinerja lebih baik daripada MySQL karena hanya satu indeks yang harus dilalui untuk sampai ke bagian fisik tabel.
Dalam model ini, indeks sering diperlukan tetapi perencana memiliki lebih banyak kebebasan kapan harus menggunakan indeks, dan implikasi dari tidak menggunakan satu indeks seringkali kurang parah. Tabel lebih umum dioptimalkan (daripada mengkhususkan diri dalam pencarian pkey) dan indeks lebih sedikit diperlukan.
TL; DR
Ketahui RDBMS-mu.
sumber
Dari Panduan Konsep Oracle 11.2:
Dari Panduan Penyesuaian Kinerja 11.2:
Dari Panduan Administrator 11.2:
sumber
Bahkan dengan semua tautan di atas, Anda perlu melihat apa yang ditulis Kimberly Tripp mengenai perawatan, pemberian makan, dan penggunaan indeks.
Sebagai permulaan, ikuti tautan ini ke koleksi posting blog terkait indeks Kimberly. Anda dapat menjelajahi topik tertentu menggunakan widget "Di halaman ini" dan "Kategori" di sisi kiri jendela browser Anda.
Ada banyak informasi di sini, tetapi jangan gentar karenanya.
Halaman Tentang Kimberly ada di sini
sumber
Berikut adalah beberapa sumber daya lain yang mungkin berguna bagi Anda jika Anda bekerja dengan SQL Server:
sumber