Ich habe eine Frage zur Rails-Datenbank.
- Sollte ich allen Fremdschlüsseln wie "xxx_id" "index" hinzufügen?
- Soll ich der automatisch erstellten Spalte "id" "index" hinzufügen?
Sollte ich der automatisch erstellten Spalte "id" "index (unique)" hinzufügen?
Wenn ich zwei Fremdschlüsseln gleichzeitig einen Index hinzufüge (
add_index (:users, [:category, :state_id])
was passiert? Wie unterscheidet sich dies vom Hinzufügen des Index für jeden Schlüssel?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
Tolle Antwort bisher. Zusätzliche Frage.
- Ich sollte "Index mit Eindeutigkeit" für xxx_id hinzufügen, oder?
Die Indizierung kann schwierig und subtil sein, es gelten jedoch allgemeine Regeln, die die Bestimmung der zu verwendenden Regeln erheblich vereinfachen können.
Das erste, woran Sie sich erinnern sollten, ist, dass Indizes auf mehrere Arten funktionieren können. Ein Index für A, B, C funktioniert auch für A, B und einfach für A, sodass Sie Ihre Indizes vielseitiger gestalten können, wenn Sie sie richtig bestellen. Das Telefonbuch ist nach Nachname, Vorname indiziert, sodass Sie Personen leicht nach ihrem Nachnamen oder einer Kombination aus Nachname und Vorname suchen können. Sie können sie jedoch nicht direkt beim Vornamen nachschlagen. Dafür benötigen Sie einen separaten Index. Gleiches gilt für die Telefonnummer, die Sie ebenfalls indizieren müssten.
In diesem Sinne gibt es viele Faktoren, die bestimmen, wie Sie Indizes erstellen:
belongs_to
-has_many
Beziehung Paarung, müssen Sie verwendet einen Index für die Fremdschlüssel haben.has_many :through
Beziehung haben, sollte Ihre Join-Tabelle einen eindeutigen Index für beide am Join beteiligten Eigenschaften als zusammengesetzten Schlüssel haben.has_many
mithilfe eines Bereichs aus einer Beziehung abrufen, stellen Sie sicher, dass ein Index vorhanden ist, der denhas_many
Fremdschlüssel und die Bereichsspalte in dieser Reihenfolge enthält.Das Ziel bei Indizes besteht darin, die gefürchteten Operationen "Tabellenscan" oder "Dateisortierung" zu beseitigen, die auftreten, wenn Ihre Daten nicht ordnungsgemäß indiziert werden.
Schauen Sie sich in einfachen Worten die Abfragen an, die von Ihrer Anwendung generiert werden, und stellen Sie sicher, dass Spalten, auf die verwiesen wird,
WHERE
oderHAVING
Bedingungen undORDER BY
Klauseln in dieser Reihenfolge dargestellt werden.quelle
index: true
Ihre Spaltendefinition für einfache Fälle hinzuzufügen , aber manchmal möchten Sie vielleicht mehr Kontrolle darüber. Indizes für Fremdschlüssel standardmäßig zu haben, ist keine schreckliche Standardeinstellung, kann aber die Leute überraschen.add_index :users, :email, unique: true
)order by [a, b]
oderfind where( a and b )
, dann benötigen Sie einen Doppelindex:Konkretes Beispiel:
Wenn Sie haben:
Sie sollten hinzufügen:
Hinweis: Ein Index belegt zusätzlichen Speicherplatz auf der Festplatte und verlangsamt das Erstellen und Aktualisieren jedes Datensatzes, da jeder Index neu erstellt werden muss.
Anerkennung:
https://tomafro.net/2009/08/using-indexes-in-rails-choosing-additional-indexes , Rails - created_at beim Benutzer für die Bestellung, Sollten Sie der Tabelle einen Index hinzufügen? und die obigen Antworten.
quelle