Bagaimana saya tahu indeks apa yang harus dibuat untuk tabel?

33

Apakah ada cara saya bisa mengetahui cara terbaik untuk mengetahui indeks mana yang akan dibuat untuk tabel?

Nick Ginanto
sumber
11
Ada. Coba gunakan-the-index-luke.com misalnya.
dezso
Jawaban yang paling sering saya lihat adalah Anda harus mengindeks kunci utama dan kolom yang Anda gunakan dalam WHEREklausa.
Oskar Persson
Tolong jangan lakukan itu. Kunci utama mendefinisikan bagaimana data diurutkan secara fisik di atas tabel dan memiliki pertimbangan sendiri. Anda harus memilih kunci utama dengan sangat hati-hati karena digunakan di semua indeks Anda yang lain juga. Lihat: sqlskills.com/blogs/kimberly/…
Ali Razeghi
4
@AliRazeghi Itu (penyortiran fisik) benar di DBMSes tertentu (dalam keadaan tertentu) dan tidak pada orang lain. Misalnya, tidak benar di PostgreSQL.
dezso
Voting kembali!
Ali Razeghi

Jawaban:

29

Aturan praktis yang singkat. (Beberapa di antaranya dibuat secara otomatis, tetapi mungkin dapat dijatuhkan secara manual nanti, tergantung pada dbms Anda. Jangan menganggap Anda akan selalu bekerja pada PostgreSQL.)

  • Indeks setiap kunci utama.
  • Indeks setiap kunci asing.
  • Buat indeks setiap kolom yang digunakan dalam klausa GABUNG.
  • Indeks setiap kolom yang digunakan dalam klausa WHERE.
  • Pelajari dokumentasi Anda untuk mempelajari opsi pengindeksan "esoterik" yang dbms Anda dukung.

Setiap kunci utama berarti bahwa kunci utama multi-kolom harus memiliki indeks tunggal yang mencakup semua kolom. PostgreSQL akan membuat indeks ini secara otomatis jika Anda mendeklarasikan kunci primer multi-kolom.

Ada banyak kasus di mana indeks multi-kolom tunggal memberi Anda kinerja yang lebih baik daripada beberapa indeks satu-kolom. Pantau pertanyaan yang lambat dan lakukan pengujian untuk mencari tahu yang mana.

Asumsikan bahwa setiap perubahan pada pengindeksan akan meningkatkan beberapa kegiatan basis data dan menurunkan yang lain. Saya merasa terbantu memiliki seperangkat pernyataan SQL yang dapat saya profil sebelum dan setelah membuat perubahan pada indeks. Set ini mencakup pernyataan SELECT, INSERT, UPDATE, dan DELETE.

Tidak ada pengganti untuk mempelajari dokumen untuk dbms khusus Anda.

  • BUAT INDEKS
  • Indeks (Catat khususnya bagian tentang ekspresi pengindeksan, pada indeks parsial, dan pada memeriksa penggunaan indeks)
Mike Sherrill 'Cat Recall'
sumber
14

Selain apa yang telah disediakan @Catcall , dan untuk menambahkan korektif kecil:

Saya juga membahas beberapa dasar dalam jawaban terkait erat pada SO baru-baru ini .

Jawaban sejauh ini tampaknya menunjukkan Anda perlu membuat indeks pada kunci utama, tetapi itu tidak terjadi di PostgreSQL (pengecualian parsial berlaku). Saya mengutip manualnya di sini :

PostgreSQL secara otomatis membuat indeks unik ketika batasan unik atau kunci utama didefinisikan untuk sebuah tabel. The Indeks mencakup kolom yang membentuk kunci utama atau kendala yang unik (indeks multicolumn, jika sesuai), dan mekanisme yang memberlakukan kendala.

Penekanan berani saya.

Anda mungkin ingin membuat indeks tambahan untuk kolom kedua atau lebih baru dari indeks multi-kolom, tetapi yang pertama umumnya tercakup dengan baik oleh indeks multicolumn - kecuali ketika kolom tambahan membuat indeks jauh lebih besar. Kami membahasnya dengan sangat terperinci di bawah pertanyaan terkait ini:

Apakah indeks komposit juga baik untuk kueri di bidang pertama?

Indeks multikolom , indeks parsial , dan indeks pada ekspresi adalah alat yang sangat kuat di PostgreSQL. Sejak PostgreSQL 9.2 ada juga hanya scan indeks , setara dengan "meliputi indeks" di RDBMS lainnya. Ini bukan tipe indeks lain, tetapi kemampuan baru RDBMS dengan tipe indeks yang ada.

Setiap indeks membawa biaya tertentu , sehingga tidak ada jalan lain di sekitar pengetahuan dasar untuk benar-benar mengoptimalkan pengindeksan. Hanya membuat lebih banyak indeks bisa lebih banyak ruginya daripada kebaikan. Secara khusus, indeks dapat mencegah pembaruan HOT dari meningkatkan kinerja.

Secara umum, operasi tulis ( DELETE, UPDATE) menjadi lebih mahal (tetapi mungkin juga bermanfaat!), Sedangkan operasi baca ( SELECT) umumnya hanya menguntungkan. Terlalu banyak indeks dapat menghabiskan memori cache sehingga bahkan operasi membaca dapat menderita.

Akhirnya, halaman Postgres Wiki ini tentang alat fitur pemeliharaan indeks untuk menemukan indeks duplikat atau tidak terpakai (antara lain).

Erwin Brandstetter
sumber
Jika saya ingat benar, indeks otomatis atas PK juga dibuat pada Oracle v.> = 10 dan Sql Server> = 2008
EAmez
1

Ada dua opsi.

  1. Anda melakukannya.
  2. Teknologi melakukannya.

Jawaban untuk melakukannya sendiri cukup lengkap didokumentasikan di sini. Jadi mari kita lihat sesuatu yang lain.

Pghero

Pghero mungkin dapat membantu Anda jika Anda menginginkan saran otomatis.

Yang mengatakan itu memiliki beberapa kekurangan.

  1. Ini hanya berfungsi WHEREdan ORDER BY, tidak JOINS.
  2. Hanya menggunakan statistik pada persen NULL, dan nilai yang berbeda.

Lihat video ini untuk informasi lebih lanjut .

Evan Carroll
sumber