sql >> Database teknologi >  >> RDS >> Mysql

60 millioner poster, vælg poster fra en bestemt måned. Hvordan optimerer man databasen?

For at få poster i en bestemt måned, for et bestemt år, hurtigere - du vil behov for at indeksere time kolonne :

CREATE INDEX idx_time ON ENTRIES(time) USING BTREE;

Brug desuden:

SELECT e.* 
  FROM ENTRIES e
 WHERE e.time BETWEEN '2010-04-01' AND DATE_SUB('2010-05-01' INTERVAL 1 SECOND)

...fordi BETWEEN er inklusiv, så du får alt dateret "2010-05-01 00:00:00" med den forespørgsel, du sendte.

Jeg vil også gerne vælge data fra en bestemt måned fra et givet DataSourceID

Du kan enten tilføje et separat indeks for datakildeid-kolonnen:

CREATE INDEX idx_time ON ENTRIES(datasourceid) USING BTREE;

...eller opsæt et dækkende indeks til at inkludere begge kolonner:

CREATE INDEX idx_time ON ENTRIES(time, datasourceid) USING BTREE;

Et dækkende indeks kræver, at kolonnerne længst til venstre skal bruges i forespørgslen, for at indekset kan bruges. I dette eksempel har time first vil virke i begge situationer, du nævnte -- datasourceid behøver ikke at blive brugt for at indekset kan bruges. Men du skal teste dine forespørgsler ved at se EXPLAIN-outputtet for virkelig at vide, hvad der fungerer bedst for dine data og de forespørgsler, der udføres på disse data.

Når det er sagt, vil indekser bremse INSERT-, UPDATE- og DELETE-udsagn. Og et indeks giver ikke megen værdi, hvis kolonnedataene har få distinkte værdier - IE:en boolsk kolonne er et dårligt valg at indeksere, fordi kardinaliteten er lav.



  1. Sådan bruger du Oracle SQL*Plus

  2. Sådan oprettes fremmednøglebegrænsning på flere kolonner i SQL Server - SQL Server / TSQL vejledning del 67

  3. Kald til udefineret funktion oci_connect()

  4. Logisk replikationspartitionering med PostgreSQL 13