sql >> Databáze >  >> RDS >> Mysql

MySQL:Rozdělení velké tabulky na oddíly nebo samostatné tabulky?

No, pokud doufáte v novou odpověď, znamená to, že jste pravděpodobně četli mé odpovědi a zním jako rozbitá deska. Viz Blog o rozdělení disku pro několik případů použití, kdy rozdělení může pomoci výkonu. Vaše není zní jako kterýkoli ze 4 případů.

Zmenšit device_id . INT je 4 bajty; opravdu máte miliony zařízení? TINYINT UNSIGNED je 1 bajt a rozsah 0..255. SMALLINT UNSIGNED je 2 bajty a rozsah 0..64 kB. Tím se stůl trochu zmenší.

Pokud váš skutečný otázka je, jak spravovat tolik dat, pak pojďme "myslet mimo krabici". Čtěte dál.

Graf... Jaká časová období zobrazujete v grafu?

  • „Poslední“ hodina/den/týden/měsíc/rok?
  • Libovolná hodina/den/týden/měsíc/rok?
  • Libovolný rozsah, který není vázán na hranice dne/týdne/měsíce/roku?

Co kreslíte?

  • Průměrná hodnota za den?
  • Max/min za den?
  • Svícny (atd.) na den, týden nebo cokoliv jiného?

Bez ohledu na případ byste měli vytvořit (a postupně udržovat) souhrnnou tabulku s daty. Řádek bude obsahovat souhrnné informace za jednu hodinu. Navrhoval bych

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;

Jedna souhrnná tabulka může mít 9 GB (pro aktuální množství dat).

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

Dalo by vám hodnoty hi/lo/avg pro 480 hodin; stačí na graf? Získání 480 řádků ze souhrnné tabulky je mnohem rychlejší než získání 60*480 řádků z tabulky nezpracovaných dat.

Získávání podobných dat po dobu jednoho roku by pravděpodobně udusilo balík grafů, takže může stojí za to vytvořit shrnutí shrnutí - s rozlišením dne. Bylo by to asi 0,4 GB.

Existuje několik různých způsobů, jak vytvořit souhrnné tabulky; můžeme o tom diskutovat poté, co se zamyslíte nad její krásou a přečtete si Blog souhrnných tabulek . Může se stát, že nejlepším způsobem je shromáždit data za jednu hodinu a poté rozšířit souhrnnou tabulku. To by bylo něco jako klopný obvod, o kterém se diskutuje můj blog o stole Staging .

A pokud jste měli hodinové souhrny, opravdu potřebujete data minutu po minutě? Zvažte její vyhození. Nebo možná data po, řekněme, jednom měsíci. To vede k použití rozdělení, ale pouze ve prospěch mazání starých dat jak je popsáno v "Případ 1" blogu o rozdělení . To znamená, že byste měli denní oddíly pomocí DROP a REORGANIZE každou noc posouvat čas tabulky "Fakt". To by vedlo ke snížení vašeho 145GB prostoru, ale bez ztráty velkého množství dat. Nová stopa:Asi 12 GB (hodinový souhrn + podrobnosti minut po minutě za posledních 30 dní)

PS:Blog souhrnné tabulky ukazuje, jak získat směrodatnou odchylku.



  1. Jaká je doporučená velikost dávky pro SqlBulkCopy?

  2. Ověřování vašich záloh PostgreSQL na Dockeru

  3. Můžete použít automatické zvýšení v MySql, aniž by to byl primární klíč

  4. Vyberte počet (*) z více tabulek