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

BLOB vs. VARCHAR pro ukládání polí v tabulce MySQL

Existuje důvod, proč nevytváříte podřízenou tabulku, abyste mohli místo pole uložit jednu hodnotu s plovoucí desetinnou čárkou na řádek?

Řekněme, že ukládáte tisíc polí po 300 prvcích za den. To je 300 000 řádků za den, tedy 109,5 milionu za rok. Nic, nad čím by se dalo kýchnout, ale v rámci možností MySQL nebo jakéhokoli jiného RDBMS.

K vašim komentářům:

Jistě, pokud je objednávka významná, přidáte pro objednávku další sloupec. Zde je návod, jak bych navrhl stůl:

CREATE TABLE VectorData (
  trial_id INT NOT NULL,
  vector_no SMALLINT UNSIGNED NOT NULL,
  order_no SMALLINT UNSIGNED NOT NULL,
  element FLOAT NOT NULL,
  PRIMARY KEY (trial_id, vector_no),
  FOREIGN KEY (trial_id) REFERENCES Trials (trial_id)
);
  • Celkový prostor pro řádek vektorových dat:300x(4+2+2+4) =3600 bajtů. Plus adresář záznamů InnoDB (vnitřní věci) o velikosti 16 bajtů.

  • Celkový prostor, pokud serializujete pole Java 300 floats =1227 bajtů?

Uložením pole tedy ušetříte asi 2400 bajtů, neboli 67 % prostoru. Předpokládejme však, že máte 100 GB místa pro uložení databáze. Uložení serializovaného pole umožňuje uložit 87,5 milionu vektorů, zatímco normalizovaný návrh umožňuje uložit pouze 29,8 milionu vektorů.

Řekl jste, že ukládáte několik stovek vektorů denně, takže tento 100GB oddíl zaplníte za pouhých 81 let namísto 239 let.

K vašemu komentáři:Výkon INSERT je důležitý problém, ale ukládáte jen několik set vektorů denně.

Většina aplikací MySQL dokáže dosáhnout stovek nebo tisíců vložení za sekundu bez nadměrného čarování.

Pokud potřebujete optimální výkon, zde je několik věcí, na které byste se měli podívat:

  • Explicitní transakce
  • Víceřádková syntaxe INSERT
  • INSERT DELAYED (pokud stále používáte MyISAM)
  • NAČTENÍ VSTUPNÍHO SOUBORU DAT
  • ALTER TABLE DISABLE KEYS, proveďte vkládání, ALTER TABLE ENABLE KEYS

Vyhledejte ve svém oblíbeném vyhledávači frázi „mysql inserts per second“ a přečtěte si mnoho článků a blogů, které o tom mluví.



  1. Seskupit MySQL podle hodin

  2. Vztah předaný do #nebo musí být strukturálně kompatibilní. Nekompatibilní hodnoty:[:reference]

  3. Problém s výkonem tabulky MySQL MyISAM byl znovu přezkoumán

  4. Jak zvýšit maximální počet připojení v MySQL