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

MySQL:Opdele et stort bord i partitioner eller separate tabeller?

Nå, hvis du håber på et nyt svar, betyder det, at du sikkert har læst mine svar, og jeg lyder som en knust rekord. Se Partitioneringsblog for de få brugstilfælde, hvor partitionering kan hjælpe med ydeevnen. Din gør ikke lyder som en af ​​de 4 sager.

Formindsk device_id . INT er 4 bytes; har du virkelig millioner af enheder? TINYINT UNSIGNED er 1 byte og et interval på 0..255. SMALLINT UNSIGNED er 2 bytes og et interval på 0..64K. Det vil skrumpe bordet lidt.

Hvis din rigtige spørgsmålet handler om, hvordan man administrerer så meget data, så lad os "tænke ud af boksen". Læs videre.

Tegner grafer... Hvilke datointervaller tegner du?

  • Den 'sidste' time/dag/uge/måned/år?
  • En vilkårlig time/dag/uge/måned/år?
  • Et vilkårligt interval, ikke bundet til dag/uge/måned/år grænser?

Hvad tegner du?

  • Gennemsnitlig værdi over en dag?
  • Maks/min i løbet af en dag?
  • Lysestager (osv.) til dag eller uge eller hvad som helst?

Uanset tilfældet bør du bygge (og trinvist vedligeholde) en oversigtstabel med data. En række ville indeholde oversigtsoplysninger i en time. Jeg vil foreslå

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;

Den ene oversigtstabel kan være 9 GB (for den aktuelle mængde data).

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

Vil give dig hi/lo/avg værdierne i 480 timer; nok til at tegne en graf? At hente 480 rækker fra oversigtstabellen er meget hurtigere end at få fat i 60*480 rækker fra rådatatabellen.

At få lignende data for et år ville sandsynligvis kvæle en grafisk pakke, så det kan være værd at bygge et resumé af resuméet -- med opløsning på en dag. Det ville være omkring 0,4 GB.

Der er et par forskellige måder at bygge oversigtstabellerne på; vi kan diskutere det, efter at du har overvejet dets skønhed og læst Blog over oversigtstabeller . Det kan være, at det er den bedste måde at indsamle data til en værdi af én time og derefter udvide oversigtstabellen. Det ville være lidt ligesom den diskuterede flip-flop min Staging table blog .

Og hvis du havde timeoversigterne, har du så virkelig brug for data fra minut for minut? Overvej at smide det væk. Eller måske data efter f.eks. en måned. Det fører til brug af partitionering, men kun til fordel for sletning af gamle data som diskuteret i "Case 1" af partitioneringsbloggen . Det vil sige, du ville have daglige partitioner ved at bruge DROP og REORGANIZE hver nat for at flytte tidspunktet for "Faktum"-bordet. Dette ville føre til at reducere dit 145 GB-fodaftryk, men uden at miste meget data. Nyt fodaftryk:Cirka 12 GB (timeoversigt + sidste 30 dages detaljer fra minut for minut)

PS:Oversigtstabelbloggen viser, hvordan man får standardafvigelse.



  1. Sådan viser du databaser og tabeller i PostgreSQL

  2. Sådan indstilles miljøvariabel Path ved hjælp af C#

  3. Opret en Excel-fil (.xlsx) ved hjælp af PL/SQL

  4. Sådan fungerer WEIGHT_STRING() i MariaDB