sql >> Database >  >> RDS >> PostgreSQL

Twee indexen nodig op een HABTM-jointabel?

Sluiten - u wilt waarschijnlijk het volgende:

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

De :unique => true is niet strikt vereist en het hangt ervan af of het zinvol is om een ​​persoon meerdere keren aan een product te koppelen. Ik zou zeggen dat als je het niet zeker weet, je waarschijnlijk wel wil de :unique vlag.

De reden voor de indexstructuur is dat alle moderne databases query's kunnen uitvoeren op zowel person_id als product_id met behulp van de eerste index ongeacht de volgorde die is opgegeven in een query . Bijv.

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

worden als hetzelfde behandeld en de database is slim genoeg om de eerste index te gebruiken.

Evenzo kunnen zoekopdrachten met alleen person_id kan ook worden uitgevoerd met behulp van de eerste index. B-tree-indexen met meerdere kolommen kunnen minder kolommen gebruiken dan ze hebben opgegeven, op voorwaarde dat ze worden opgegeven aan de linkerkant van de oorspronkelijke declaratie.

Voor vragen met alleen product_id , kan dit niet worden uitgevoerd tegen de eerste index (aangezien die index is gedefinieerd met person_id in de meest linkse positie). Daarom heb je een aparte index nodig om alleen op dat veld opzoekingen mogelijk te maken.

De eigenschap b-tree index met meerdere kolommen is ook van toepassing op indexen met een groter aantal kolommen. Als je een index had op (person_id, product_id, favorite_color, shirt_size) , kunt u die index gebruiken om zoekopdrachten uit te voeren met behulp van person_id , (person_id, product_id) , etc, zolang de volgorde overeenkomt met de definitie.



  1. Onder welke omstandigheden verhoogt ROWNUM=1 de prestaties in een bestaande syle-query aanzienlijk?

  2. Wat doet CONSTRAINT in MySQL met FK's?

  3. Veelvoorkomende fouten bij het migreren van PostgreSQL-databases van on-premises naar AWS RDS

  4. SQL-serverquery om de lijst met kolommen in een tabel te krijgen, samen met gegevenstypen, NOT NULL en PRIMARY KEY-beperkingen