2013-03-04 10 views
25

Prosty has_and_belongs_to_many stowarzyszenie:Potrzebujesz dwóch indeksów na tabeli sprzężenia HABTM?

Person has_and_belongs_to_many :products 
Product has_and_belongs_to_many :persons 

Czy zarówno z następujących wskaźników pomocnych w celu uzyskania optymalnej wydajności?

add_index :person_products, [:person_id, :product_id] 
add_index :person_products, [:product_id, :person_id] 

Odpowiedz

0

Wystarczy jeden, chyba że robisz unique

add_index :person_products, :person_id 
add_index :person_products, :product_id 

Albo dla indeksu na obu kolumnach

add_index :person_products, [:person_id, :product_id] 

Pomoże wydajność podczas odpytywania na tych kolumn w bazie danych . To zależy od zapytania, jeśli zawiera zarówno kolumny, jak i tylko jedną.

http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/add_index

+3

Rozumiem, że jeśli zapytanie zostanie wysłane przez "id_produktu", a następnie "id_osobisty", nie będzie używać indeksu w obu kolumnach, które masz powyżej. – sscirrus

1

Tak, są pomocne. Ale czy naprawdę ich potrzebujesz? Wszystko zależy od tego, co z tym zrobisz. Indeks na temat (person_id,product_id) pozwoli szybko znaleźć produkty należące do osoby, ale nie pomoże znaleźć osób posiadających określony produkt. Będzie również wymuszać UNIQUE, więc prawdopodobnie powinieneś go użyć. oddzielne indeksy na (person_id) i (product_id) pozwoli Ci znaleźć zarówno produkty należące do osoby i osób, które posiadają określony produkt. Indeksy na (person_id,product_id) i (product_id,person_id) będą działać również w obu przypadkach i będą szybsze, ale zajmą więcej miejsca i zajmie trochę (bardzo mało) więcej podczas wstawiania/aktualizowania wierszy. Godzina czasu i przestrzeni jest prawie zawsze warta, chyba że masz bazę, w której piszesz częściej niż czytasz. Osobiście widziałem Indeksowanie tylko skanów w 9.2 korzyści znacznie z dwóch indeksów w obu kolumnach. Więc prawdziwy wybór jest pomiędzy:

unique index on (col 2, col 1), unique index on (col 1, col 2)

i

unique Index on (col 1, col 2), index on (col 2)

38

Blisko - najprawdopodobniej chcą następujące:

add_index :person_products, [:person_id, :product_id], :unique => true 
add_index :person_products, :product_id 

:unique => true nie jest bezwzględnie wymagane i to zależy od tego, czy posiadanie osoby stowarzyszonej ma sens ed z produktem wiele razy. Powiedziałbym, jeśli nie jesteś pewien, prawdopodobnie do chcesz flaga :unique.

Powodem konstrukcji indeksu jest to, że wszystkie nowoczesne bazy danych mogą wykonywać kwerendy na obu person_id i PRODUCT_ID używając pierwszego indeksu niezależnie od kolejności podanej w zapytaniu. Na przykład.

SELECT foo FROM bar WHERE person_id = 1 AND product_id = 2 
SELECT foo FROM bar WHERE product_id = 2 AND person_id = 1 

są traktowane tak samo, a baza danych jest wystarczająco inteligentna, aby użyć pierwszego indeksu.

Podobnie, zapytania korzystające tylko z person_id mogą być również uruchamiane przy użyciu pierwszego indeksu. Wielokolumnowe indeksy B-drzewa mogą wykorzystywać mniej kolumn niż pod warunkiem, że są określone po lewej stronie oryginalnej deklaracji.

Dla zapytań używających tylko product_id, nie można tego dokonać wobec pierwszego indeksu (ponieważ ten indeks jest zdefiniowany z person_id w skrajnej lewej pozycji). Dlatego potrzebny jest osobny indeks, aby umożliwić wyszukiwanie tylko w tym polu.

Właściwość indeksu wielu drzewiastych indeksów b także obejmuje indeksy o większej liczbie kolumn. Jeśli masz indeks na (person_id, product_id, favorite_color, shirt_size), możesz użyć tego indeksu do uruchamiania zapytań przy użyciu person_id, (person_id, product_id) itd., O ile zamówienie jest zgodne z definicją.

Powiązane problemy