Di mana saya dapat menemukan panduan tentang strategi indeks?

22

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?

SpecialAgent_W436
sumber
7
Untuk panduan tentang pengindeksan, gunakan-the-index-luke.com
Mike Sherrill 'Cat Recall'

Jawaban:

24

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:

  • indeks berkerumun luas (terutama SQL Server)
  • clustered non-monoton diindeks
  • indeks yang tumpang tindih (mis. cold, coledancold, cole, colf)
  • banyak indeks kolom tunggal (juga tumpang tindih dengan indeks lebih bermanfaat) yang tidak berguna untuk permintaan Anda
  • tidak ada TERMASUK, tidak mencakup (mis. semua indeks kolom tunggal)
  • ...

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

  • indeks berkerumun (biasanya PK)
  • indeks unik (bukan kendala, ini tidak dapat mencakup)
  • kolom kunci asing

Lalu saya akan melihat:

  • pertanyaan umum dan lihat apa yang saya butuhkan. Permintaan yang berjalan setiap detik perlu disetel. Laporan pada hari Minggu jam 4 pagi bisa menunggu.
  • dengan SQL Server, DMV indeks tertimbang yang hilang

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.

gbn
sumber
2
Dari mana Anda mendapatkan angka-angka itu? 98% tampaknya sangat tinggi, terutama di zaman "data besar" (alias menyimpan semuanya dan berharap itu berguna suatu hari)
rm
7

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.

ldsandon
sumber
7

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.

TRAD
sumber
Hanya catatan untuk pembaca: "Penandaan bookmark" MS SQL setara dengan "ACCESS BY ROWID" Oracle. Lihat stackoverflow.com/a/820731/122727
kubanczyk
5

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:

  1. Pemindaian berurutan di Innodb menghasilkan banyak I / O disk acak , dan

  2. Indeks kunci utama harus dilalui terlepas dari apakah seseorang menggunakan indeks sekunder.

  3. 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:

  1. 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.

  2. Pemindaian urutan fisik berkinerja lebih baik, mengurangi I / O disk acak tempat sejumlah besar baris akan diproses.

  3. 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.

Chris Travers
sumber
2

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

Robert Miller
sumber