sql >> Databasteknik >  >> RDS >> Mysql

MySQL:Dela upp ett stort bord i partitioner eller separata tabeller?

Tja, om du hoppas på ett nytt svar betyder det att du förmodligen har läst mina svar, och jag låter som en bruten skiva. Se Partitioneringsblogg för de få användningsfall där partitionering kan hjälpa prestanda. Din gör det inte låter som något av de fyra fallen.

Krympa device_id . INT är 4 byte; har du verkligen miljontals enheter? TINYINT UNSIGNED är 1 byte och ett intervall på 0..255. SMALLINT UNSIGNED är 2 byte och ett intervall på 0..64K. Det kommer att krympa bordet lite.

Om din riktiga Frågan handlar om hur man hanterar så mycket data, låt oss då "tänka utanför boxen". Läs vidare.

Plotta... Vilka datumintervall ritar du?

  • Den "senaste" timmen/dag/vecka/månad/år?
  • En godtycklig timme/dag/vecka/månad/år?
  • Ett godtyckligt intervall, inte bundet till dag/vecka/månad/år gränser?

Vad ritar du?

  • Genomsnittligt värde under en dag?
  • Max/min under en dag?
  • Ljusstakar (etc) för dag eller vecka eller vad som helst?

Oavsett fall bör du bygga (och stegvis underhålla) en sammanfattningstabell med data. En rad skulle innehålla sammanfattande information under en timme. Jag skulle föreslå

CREATE TABLE Summary (
    device_id SMALLINT UNSIGNED NOT NULL,
    sensor_id TINYINT UNSIGNED NOT NULL,
    hr TIMESTAMP NOT NULL,
    avg_val FLOAT NOT NULL,
    min_val FLOAT NOT NULL,
    max_val FLOAT NOT NULL
    PRIMARY KEY (device_id, sensor_id, hr)
) ENGINE=InnoDB;

Sammanfattningstabellen kan vara 9 GB (för aktuell mängd data).

SELECT hr,
       avg_val,
       min_val,
       max_val
    FROM Summary
    WHERE device_id = ?
      AND sensor_id = ?
      AND hr >= ?
      AND hr  < ? + INTERVAL 20 DAY;

Skulle ge dig hi/lo/avg-värdena för 480 timmar; tillräckligt för att rita? Att ta 480 rader från sammanfattningstabellen är mycket snabbare än att ta 60*480 rader från rådatatabellen.

Att få liknande data för ett år skulle förmodligen kväva ett grafpaket, så det kan vara värt att bygga en sammanfattning av sammanfattningen -- med en upplösning på en dag. Det skulle vara ungefär 0,4 GB.

Det finns några olika sätt att bygga sammanfattningstabellen/tabellerna; vi kan diskutera det efter att du har begrundat dess skönhet och läst Blogg för sammanfattningstabeller . Det kanske är det bästa sättet att samla in en timmes data och sedan utöka tabellen Sammanfattning. Det skulle vara ungefär som den vippa som diskuterades min Staging table-blogg .

Och om du hade timsammanfattningarna, behöver du verkligen data från minut för minut? Överväg att slänga den. Eller, kanske data efter, säg, en månad. Det leder till användning av partitionering, men enbart för dess fördel vid radering av gammal data som diskuteras i "Fall 1" av partitioneringsblogg . Det vill säga, du skulle ha dagliga partitioner med DROP och REORGANIZE varje kväll för att flytta tiden för "Fakta"-bordet. Detta skulle leda till att ditt 145 GB-fotavtryck minskar, men utan att förlora mycket data. Nytt fotavtryck:Cirka 12 GB (Timöversikt + senaste 30 dagarnas detaljer från minut för minut)

PS:Sammanfattningstabellbloggen visar hur man får standardavvikelse.



  1. Hur hittar man vilka e-postmeddelanden som finns i samma listor?

  2. ta bort SQLite-databas när du uppdaterar ny version av programmet

  3. MySQL - Välj alla utom det som finns i den här tabellen

  4. Hur man hittar de datumformat som används för ett specifikt språk i SQL Server (T-SQL)