sql >> Databasteknik >  >> RDS >> Mysql

60 miljoner poster, välj poster från en viss månad. Hur optimerar man databasen?

För att få bidrag under en viss månad, för ett visst år, snabbare - du måste indexera time kolumn :

CREATE INDEX idx_time ON ENTRIES(time) USING BTREE;

Använd dessutom:

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

...eftersom BETWEEN är inkluderande, så du får allt daterat "2010-05-01 00:00:00" med den fråga du postade.

Jag skulle också vilja välja data från en viss månad från ett givet DataSourceID

Du kan antingen lägga till ett separat index för kolumnen datasourceid:

CREATE INDEX idx_time ON ENTRIES(datasourceid) USING BTREE;

...eller ställ in ett täckande index för att inkludera båda kolumnerna:

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

Ett täckande index kräver att kolumnerna längst till vänster måste användas i frågan för att indexet ska användas. I det här exemplet har time first kommer att fungera för båda situationerna du nämnde -- datasourceid behöver inte användas för att indexet ska vara användbart. Men du måste testa dina frågor genom att titta på EXPLAIN-utdata för att verkligen veta vad som fungerar bäst för din data och de frågor som utförs på den datan.

Som sagt, index kommer att sakta ner INSERT-, UPDATE- och DELETE-satser. Och ett index ger inte mycket värde om kolumndata har få distinkta värden - IE:en boolesk kolumn är ett dåligt val att indexera, eftersom kardinaliteten är låg.



  1. Ska jag använda makron eller VBA-kod?

  2. Hur kan jag undertrycka kolumnrubrikutdata för en enda SQL-sats?

  3. Infoga data i en MySQL-databas

  4. Jämför exekveringsplaner i SQL Server