Saya punya pertanyaan tentang database Rails.
- Haruskah saya menambahkan "indeks" ke semua kunci asing seperti "xxx_id"?
- Haruskah saya menambahkan "indeks" ke kolom "id" yang dibuat secara otomatis?
Haruskah saya menambahkan "indeks (unik)" ke kolom "id" yang dibuat secara otomatis?
Jika saya menambahkan indeks ke dua kunci asing sekaligus (
add_index (:users, [:category, :state_id])
, apa yang terjadi? Apa bedanya dengan menambahkan indeks untuk setiap kunci?class CreateUsers < ActiveRecord::Migration def self.up create_table :users do |t| t.string :name t.integer :category_id t.integer :state_id t.string :email t.boolean :activated t.timestamps end # Do I need this? Is it meaningless to add the index to the primary key? # If so, do I need :unique => true ? add_index :users, :id # I don't think I need ":unique => true here", right? add_index :users, :category_id # Should I need this? add_index :users, :state_id # Should I need this? # Are the above the same as the following? add_index (:users, [:category, :state_id]) end end
Jawaban yang bagus sejauh ini. Pertanyaan tambahan.
- Saya harus menambahkan "indeks dengan unik" untuk xxx_id, kan?
Pengindeksan bisa menjadi hal yang rumit dan sulit, tetapi ada aturan umum yang berlaku yang dapat membuat menentukan mana yang akan digunakan lebih mudah.
Hal pertama yang harus diingat adalah bahwa indeks dapat bekerja dalam lebih dari satu cara. Indeks pada A, B, C juga berfungsi untuk A, B dan hanya A, sehingga Anda dapat merancang indeks Anda menjadi lebih fleksibel jika Anda memesannya dengan benar. Buku telepon diindeks pada Nama Belakang, Nama Depan, sehingga Anda dapat mencari orang dengan mudah dengan nama belakang mereka, atau kombinasi dari nama belakang dan nama depan. Namun, Anda tidak dapat mencarinya langsung dengan nama depan. Anda perlu indeks terpisah untuk itu. Hal yang sama berlaku untuk nomor telepon, yang harus Anda indeks juga.
Dengan mengingat hal itu, ada banyak hal yang akan menentukan bagaimana Anda membuat indeks:
belongs_to
-has_many
hubungan pasangan, Anda harus memiliki indeks pada kunci asing yang digunakan.has_many :through
hubungan, tabel gabungan Anda harus memiliki indeks unik pada kedua properti yang terlibat dalam gabungan sebagai kunci gabungan.has_many
hubungan menggunakan cakupan, pastikan ada indeks yang menyertakanhas_many
kunci asing dan kolom lingkup dalam urutan itu.Tujuan dengan indeks adalah untuk mengeliminasi operasi "pemindaian tabel" atau "pengurutan file" yang terjadi ketika data Anda tidak diindeks dengan benar.
Dalam istilah sederhana, lihat kueri yang dihasilkan oleh aplikasi Anda dan pastikan bahwa kolom yang dirujuk dalam
WHERE
atauHAVING
kondisi danORDER BY
klausa disajikan dalam urutan itu.sumber
index: true
definisi kolom Anda untuk kasus-kasus sederhana, tetapi kadang-kadang Anda mungkin ingin lebih banyak kontrol atasnya. Memiliki indeks secara default pada kunci asing bukanlah standar yang buruk untuk dimiliki, tetapi mungkin mengejutkan banyak orang.add_index :users, :email, unique: true
)order by [a, b]
ataufind where( a and b )
, maka Anda memerlukan indeks ganda:Contoh nyata:
Jika Anda memiliki:
Anda harus menambahkan:
Catatan: Indeks membutuhkan ruang ekstra pada disk dan membuatnya lebih lambat untuk membuat dan memperbarui setiap catatan, karena harus membangun kembali setiap indeks.
Kredit:
https://tomafro.net/2009/08/using-indexes-in-rails-choosing-additional-indexes , rails - Created_at saat pengguna memesan, Haruskah Anda menambahkan Indeks ke tabel? , dan jawaban di atas.
sumber