sql >> Database >  >> RDS >> Mysql

60 miljoen inzendingen, selecteer inzendingen uit een bepaalde maand. Hoe database optimaliseren?

Om inzendingen in een bepaalde maand, voor een bepaald jaar, sneller te krijgen - u moet de time indexeren kolom :

CREATE INDEX idx_time ON ENTRIES(time) USING BTREE;

Gebruik daarnaast:

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

...omdat BETWEEN inclusief is, dus je krijgt alles met de datum "2010-05-01 00:00:00" bij de zoekopdracht die je hebt gepost.

Ik wil ook graag gegevens van een bepaalde maand selecteren uit een bepaalde DataSourceID

U kunt een aparte index toevoegen voor de datasourceid-kolom:

CREATE INDEX idx_time ON ENTRIES(datasourceid) USING BTREE;

...of stel een dekkingsindex in om beide kolommen op te nemen:

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

Een dekkende index vereist dat de meest linkse kolommen in de query moeten worden gebruikt om de index te gebruiken. In dit voorbeeld, met time first zal werken voor beide situaties die u noemde -- datasourceid hoeft niet te worden gebruikt om de index te gebruiken. Maar u moet uw zoekopdrachten testen door de EXPLAIN-uitvoer te bekijken om echt te weten wat het beste werkt voor uw gegevens en de zoekopdrachten die op die gegevens worden uitgevoerd.

Dat gezegd hebbende, zullen indexen de INSERT-, UPDATE- en DELETE-instructies vertragen. En een index biedt niet veel waarde als de kolomgegevens weinig verschillende waarden hebben - IE:een booleaanse kolom is een slechte keuze om te indexeren, omdat de kardinaliteit laag is.



  1. Kan niet decoderen met pgcrypto van AES-256-CBC, maar AES-128-CBC is OK

  2. Te vermijden valkuilen bij het gebruik van de nieuwe Microsoft SSMA-versie 7.8 "

  3. Gegroepeerde aaneenschakeling :Duplicaten bestellen en verwijderen

  4. Hoe de huidige instellingen voor puntopdrachten in SQLite te tonen