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

Mohu nastavit Mysql na automatické rozdělení?

(Tato odpověď je zaměřena na schéma a SELECT.)

Vzhledem k tomu, že očekáváte miliony řádků, chci nejprve upozornit na některá vylepšení schématu.

  • FLOAT(m,n) je obvykle 'špatná' věc, protože to vede ke dvěma zaokrouhlování. Buď použijte obyčejný FLOAT (což se zdá „správné“ pro metriky jako napětí) nebo použijte DECIMAL(m,n) . FLOAT je 4 bajty; v uvedených případech DECIMAL bude 3 nebo 4 bajty.

  • Když máte oba INDEX(a) a INDEX(a,b) , první je zbytečný, protože druhý může takové pokrýt. Máte 3 zbytečné KLÍČE. To zpomaluje INSERTs .

  • INT(3) -- Říkáte "3místné číslo"? Pokud ano, zvažte TINYINT UNSIGNED (hodnoty 0..255) pro 1 bajt místo INT pro 4 bajty. To ušetří mnoho MB místa na disku, a tím i rychlost. (Viz také SMALLINT , atd. a SIGNED nebo UNSIGNED .)

  • Pokud filename se hodně opakuje, možná to budete chtít "normalizovat". To by ušetřilo mnoho MB.

  • Použijte NOT NULL pokud nepotřebujete NULL za něco.

  • AUTO_INCREMENT=690892041 znamená, že s id jste asi v 1/3 cesty ke katastrofě , což bude na vrcholu asi 2 miliard. Používáte id za cokoli? Zbavením se sloupce by se předešlo problému; a změňte UNIQUE KEY na PRIMARY KEY . (Pokud potřebujete id , pojďme mluvit dále.)

  • ENGINE=MyISAM -- Přepínání má určité důsledky, příznivé i nepříznivé. Stůl by byl 2-3krát větší. „Správná“ volba PRIMARY KEY by to dále urychlilo to SELECTs výrazně. (A může nebo nemusí zpomalit další SELECTs .)

Poznámka k SELECTs :Od string a unit_num jsou konstanty v dotazu, poslední dvě pole ORDER BY timestamp asc, string asc, unit_num asc jsou zbytečné. Pokud jsou relevantní z důvodů, které nejsou patrné v SELECTs , pak moje rada může být neúplná.

Toto

WHERE filename = 'foobar'
  AND unit_num='40'
  AND string='2' 
  AND timestamp >= ...

je optimálně zpracován pomocí INDEX(filename, unit_name, string, timestamp) . Pořadí sloupců není důležité kromě toto timestamp musí být poslední . Změna uspořádání aktuálního UNIQUE získáte optimální index. (Mezitím žádný z indexů není pro tento SELECTs příliš dobrý .) Udělat z něj PRIMARY KEY a tabulka InnoDB by to ještě zrychlila.

Dělení oddílů? Žádná výhoda. Ne pro výkon; ne pro nic jiného, ​​co jste zmínil. Běžné použití pro dělení je pro vyčištění 'starého'. Pokud to máte v úmyslu udělat, promluvme si dále.

V obrovských tabulkách je nejlepší podívat se na všechny důležité SELECTs současně, abychom jednoho nezrychlili a nezničili rychlost ostatních. může dokonce se ukázalo, že rozdělení pomáhá v tomto druhu kompromisu.



  1. Najděte překrývající se období v PostgreSQL

  2. MYSQL Zaokrouhlete datum a čas na 15 minut

  3. Modul Export výsledku async fn

  4. Jak funguje funkce REGEXP_LIKE() v MySQL