sql >> Database >  >> RDS >> Mysql

MySQL:een grote tafel opsplitsen in partities of aparte tabellen?

Nou, als je op een nieuw antwoord hoopt, betekent dat dat je waarschijnlijk mijn antwoorden hebt gelezen, en ik klink als een gebroken plaat. Zie Blog over partitioneren voor de weinige gevallen waarin partitionering de prestaties kan helpen. Die van jou niet klinkt als een van de 4 gevallen.

Verklein device_id . INT is 4 bytes; heb je echt miljoenen apparaten? TINYINT UNSIGNED is 1 byte en een bereik van 0..255. SMALLINT UNSIGNED is 2 bytes en een bereik van 0..64K. Dat zal de tafel een beetje verkleinen.

Als je echte vraag is hoe we zoveel gegevens kunnen beheren, laten we dan "out of the box" denken. Lees verder.

Grafieken... Welke periodes tekent u?

  • Het 'laatste' uur/dag/week/maand/jaar?
  • Een willekeurig uur/dag/week/maand/jaar?
  • Een willekeurig bereik, niet gebonden aan dag/week/maand/jaar grenzen?

Wat teken je?

  • Gemiddelde waarde over een dag?
  • Max./min gedurende een dag?
  • Kandelaars (enz.) voor dag of week of wat dan ook?

Ongeacht het geval moet u een overzichtstabel met gegevens bouwen (en stapsgewijs onderhouden). Een rij zou samenvattende informatie voor één uur bevatten. Ik zou aanraden

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;

De enige overzichtstabel kan 9 GB zijn (voor de huidige hoeveelheid gegevens).

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

Zou u de hi/lo/avg-waarden voor 480 uur geven; genoeg om te tekenen? 480 rijen uit de overzichtstabel halen is een stuk sneller dan 60*480 rijen uit de onbewerkte gegevenstabel halen.

Het verkrijgen van vergelijkbare gegevens voor een jaar zou waarschijnlijk een grafisch pakket verstikken, dus het misschien de moeite waard zijn om een ​​samenvatting van de samenvatting te maken -- met een resolutie van een dag. Het zou ongeveer 0,4 GB zijn.

Er zijn een paar verschillende manieren om de samenvattingstabel(len) te maken; we kunnen dat bespreken nadat je hebt nagedacht over de schoonheid ervan en het blog met samenvattingstabellen . Het kan zijn dat het verzamelen van een uur aan gegevens, en vervolgens het vergroten van de overzichtstabel, de beste manier is. Dat zou enigszins lijken op de flip-flop besproken mijn Staging-tabelblog .

En als u de uuroverzichten had, heeft u dan echt de gegevens van minuut tot minuut nodig? Overweeg om het weg te gooien. Of misschien gegevens na bijvoorbeeld een maand. Dat leidt tot het gebruik van partitionering, maar alleen voor het voordeel ervan bij het verwijderen van oude gegevens zoals besproken in "Case 1" van Partitioneringsblog . Dat wil zeggen, je zou dagelijkse partities hebben, met behulp van DROP en REORGANIZE elke nacht om de tijd van de "Feiten" tafel te verschuiven. Dit zou ertoe leiden dat u uw footprint van 145 GB verkleint, maar zonder veel gegevens te verliezen. Nieuwe voetafdruk:ongeveer 12 GB (overzicht per uur + details van minuut tot minuut van de afgelopen 30 dagen)

PS:De Samenvattingstabel blog laat zien hoe u de standaarddeviatie kunt krijgen.



  1. Meerdere GROUP_CONCAT op verschillende velden met MySQL

  2. dpkg:fout bij verwerking van pakket mysql-server (afhankelijkheidsproblemen)?

  3. Snelste manier om te controleren op reeds bestaande records voordat u deze invoegt [mysql_errno()]

  4. Verward over UPDLOCK, HOLDLOCK