sql >> Databáze >  >> RDS >> PostgreSQL

Potřebujete dva indexy na spojovací tabulce HABTM?

Zavřít – pravděpodobně budete chtít následující:

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

:unique => true není striktně vyžadováno a záleží na tom, zda má smysl mít osobu spojenou s produktem vícekrát. Řekl bych, že pokud si nejste jisti, pravděpodobně ano chcete :unique vlajka.

Důvodem struktury indexu je, že všechny moderní databáze mohou provádět dotazy na person_id i product_id pomocí prvního indexu bez ohledu na pořadí zadané v dotazu . Např.

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

jsou považovány za stejné a databáze je dostatečně chytrá na to, aby používala první index.

Stejně tak dotazy používající pouze person_id lze také spustit pomocí prvního indexu. Vícesloupcové indexy b-stromu mohou používat méně sloupců, než kolik za předpokladu, že jsou specifikovány zleva od původní deklarace.

Pro dotazy používající pouze product_id , nelze to provést proti prvnímu indexu (protože tento index je definován s person_id na pozici zcela vlevo). Proto potřebujete samostatný index, abyste umožnili vyhledávání pouze v tomto poli.

Vlastnost indexu vícesloupcového b-stromu se také vztahuje na indexy s vyšším počtem sloupců. Pokud jste měli index na (person_id, product_id, favorite_color, shirt_size) , můžete tento index použít ke spouštění dotazů pomocí person_id , (person_id, product_id) atd., pokud objednávka odpovídá definici.



  1. Analýza protokolů PostgreSQL s pgBadger

  2. Nastavení XAMPP - MySQL nefunguje

  3. PGError:ERROR:povolení odepřeno pro vztah (při použití Heroku)

  4. Vypočítejte hash nebo kontrolní součet pro tabulku na serveru SQL Server