sql >> Database >  >> RDS >> Mysql

DO's en DONT's voor indexen

Algemeen gesproken:

1. Voeg geen index toe tenzij u deze echt nodig heeft.

Elke index maakt schrijven langzamer...

2. Er wordt een index gebruikt op waar-clausules:

-- index on foo (bar)
select bar from foo where bar = :bar;

Op dezelfde manier zal het worden gebruikt in refererende sleutelreferenties (in beide tabellen).

-- index on foo (bar) if baz (bar) is frequently updated/deleted.
create table foo (bar references baz (bar)); 

3. Er wordt een index gebruikt om te sorteren, vooral wanneer deze aan een limiet is gebonden:

-- index on foo (bar)
select bar from foo order by bar limit 10;

4. Indexen met meerdere kolommen zijn soms handig wanneer 2. en 3. beide van toepassing zijn.

In dit geval zet u eerst de waar-voorwaarden en de sorteersleutel als laatste:

-- index on foo (baz, bar)
select bar from foo where baz between :baz1 and :baz2 group by bar;

5. Houd uw tafelstatistieken up-to-date.

Als de tabelstatistieken onzin zijn, is de kans klein dat de optimizer uw indexen gebruikt. Handmatig uw database stofzuigen/analyseren indien nodig.

6. Indexgebruik is afhankelijk van uw tabelpartitie.

Voorbij een bepaalde drempel van opgehaalde rijen, is het sneller om een ​​volledige tabelscan uit te voeren. Als uw index zich in een booleaans veld bevindt dat uw tabel min of meer in tweeën deelt, wordt deze nooit gebruikt.

Evenzo, als uw gegevens op zo'n manier zijn opgeslagen dat de indexscan waarschijnlijk willekeurig toegang zal krijgen tot bijna elke toepasselijke schijfpagina voor die tabel, geeft de planner de voorkeur aan een volledige tabelscan.

7. Overweeg gedeeltelijke/expressie-indexen indien beschikbaar.

Als u een veld heeft dat dezelfde waarde heeft, behalve 10% van uw rijen, overweeg dan een gedeeltelijke index erop (d.w.z. waar niet die waarde). Dit resulteert in een veel kleinere index zonder de daadwerkelijke bruikbaarheid ervan te belemmeren.

Als u constant query's uitvoert op een uitdrukking die op uw kolom is toegepast en uw platform biedt uitdrukkingsindexen, overweeg dan om er een index aan toe te voegen. Bij gebruik wordt de uitdrukking niet voor elke rij geëvalueerd.



  1. De string splitsen in de sql-server

  2. Hoe CONV() werkt in MariaDB

  3. Oproep naar ongedefinieerde functie oci_connect()

  4. Wat is het verschil tussen een tijdelijke tabel en een tabelvariabele in SQL Server?