Mam pytanie dotyczące bazy danych Railsów.
- Czy powinienem dodać „index” do wszystkich kluczy obcych, takich jak „xxx_id”?
- Czy powinienem dodać „indeks” do automatycznie utworzonej kolumny „identyfikator”?
Czy powinienem dodać „indeks (unikalny)” do automatycznie utworzonej kolumny „identyfikator”?
Jeśli dodam indeks do dwóch kluczy obcych naraz (
add_index (:users, [:category, :state_id])
co się stanie? Czym to się różni od dodawania indeksu dla każdego klucza?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
Jak dotąd świetna odpowiedź. Dodatkowe pytanie.
- Powinienem dodać „indeks z unikatowym” dla xxx_id, prawda?
Indeksowanie może być trudną i subtelną rzeczą, ale istnieją ogólne zasady, które mogą znacznie ułatwić określenie, którego użyć.
Pierwszą rzeczą do zapamiętania jest to, że indeksy mogą działać na więcej niż jeden sposób. Indeks na A, B, C działa również dla A, B i po prostu A, więc możesz zaprojektować swoje indeksy tak, aby były bardziej wszechstronne, jeśli uporządkujesz je poprawnie. Książka telefoniczna jest indeksowana według nazwiska, imienia, dzięki czemu można łatwo wyszukiwać osoby według ich nazwiska lub kombinacji nazwiska i imienia. Nie możesz jednak wyszukać ich bezpośrednio po imieniu. Do tego potrzebny byłby oddzielny indeks. To samo dotyczy numeru telefonu, który również musiałbyś zindeksować.
Mając to na uwadze, istnieje wiele rzeczy, które będą decydować o sposobie tworzenia indeksów:
belongs_to
-has_many
, musisz mieć indeks używanego klucza obcego.has_many :through
relację, twoja tabela łączenia powinna mieć unikalny indeks dla obu właściwości związanych z łączeniem jako klucz złożony.has_many
relacji przy użyciu zakresu, upewnij się, że istnieje indeks zawierającyhas_many
klucz obcy i kolumnę zakresu w tej kolejności.Celem indeksów jest wyeliminowanie przerażających operacji „skanowania tabeli” lub „sortowania plików”, które występują, gdy dane nie są prawidłowo indeksowane.
Upraszczając, spójrz na zapytania generowane przez aplikację i upewnij się, że kolumny, do których odwołuje się
WHERE
lubHAVING
warunki iORDER BY
klauzule, są reprezentowane w tej kolejności.źródło
index: true
przypadku prostych przypadków dodanie definicji kolumny jest dość łatwe , ale czasami możesz chcieć mieć nad nią większą kontrolę. Posiadanie domyślnych indeksów kluczy obcych nie jest strasznym domyślnym posiadaniem, ale może zaskoczyć ludzi.add_index :users, :email, unique: true
)order by [a, b]
lubfind where( a and b )
, potrzebujesz podwójnego indeksu:Konkretny przykład:
Jeśli masz:
Należy dodać:
Uwaga: indeks zajmuje dodatkowe miejsce na dysku i spowalnia tworzenie i aktualizowanie każdego rekordu, ponieważ musi on odbudowywać każdy indeks.
Kredyt:
https://tomafro.net/2009/08/using-indexes-in-rails-choosing-additional-indexes , rails - created_at, gdy użytkownik zamawia, czy należy dodać indeks do tabeli? i odpowiedzi powyżej.
źródło