sql >> Databáze >  >> RDS >> MariaDB

Návrh databáze 101:Oddíly v MySQL

V tomto příspěvku na blogu budeme diskutovat o jedné z nejpoužívanějších funkcí MySQL – oddílech.

Co je to rozdělení?

V MySQL je rozdělení na oddíly technika návrhu databáze, při které databáze rozděluje data do více tabulek, ale stále s nimi zachází jako s jedinou tabulkou ve vrstvě SQL. Jednoduše řečeno, když tabulku rozdělíte, rozdělíte ji na více podtabulek:dělení se používá, protože zlepšuje výkon určitých dotazů tím, že jim umožňuje přístup pouze k části dat, čímž je zrychluje. I/O operace lze také zlepšit, protože data a indexy lze rozdělit na mnoho diskových svazků.

Existují dva typy rozdělení:horizontální a vertikální. Horizontální dělení zahrnuje vkládání různých řádků do různých tabulek, vertikální dělení na druhou stranu zahrnuje vytváření tabulek s menším počtem sloupců a použití dalších tabulek k uložení zbývajících sloupců.

Jak rozdělení funguje?

  • Když se použijí dotazy SELECT, rozdělovací vrstva otevře a zamkne oddíly, optimalizátor dotazů určí, zda lze některý z oddílů ořezat, a poté rozdělovací vrstva předá volání API obslužného programu do úložiště, které zpracovává oddíly.
  • Při použití dotazů INSERT se otevře a zamkne rozdělovací vrstva, určí, ke kterému oddílu má řádek patřit, a poté předá řádek tomuto oddílu.
  • Při použití dotazů DELETE se otevře a uzamkne rozdělovací vrstva, určí, který oddíl obsahuje řádek, a poté řádek z tohoto oddílu odstraní.
  • Při použití dotazů UPDATE otevře a uzamkne rozdělovací vrstva oddíly, zjistí, který oddíl obsahuje řádek, načte řádek a upraví jej, poté určí, který oddíl by měl obsahovat nový řádek, předá řádek dál do nového oddílu s požadavkem na vložení, poté předá požadavek na smazání původnímu oddílu.

Kdy byste měli používat dělení?

Obecně je rozdělení užitečné, když:

  • Máte spoustu dat, která musíte procházet.
  • Vaše stoly jsou příliš velké a nevejdou se do paměti.
  • Vaše tabulky obsahují historická data a nová data se přidávají do nejnovějšího oddílu.
  • Myslíte si, že budete muset distribuovat obsah tabulky mezi různá úložná zařízení.
  • Myslíte si, že budete muset obnovit jednotlivé oddíly.

Pokud jeden nebo více scénářů popsaných výše popisuje vaši situaci, rozdělení může pomoci. Před rozdělením dat však mějte na paměti, že oddíly MySQL mají svá vlastní omezení:

  • Výrazy pro dělení neumožňují použití uložených procedur, uložených funkcí, uživatelsky definovaných funkcí (UDF) nebo zásuvných modulů as omezenou podporou funkcí SQL. Také nemůžete použít deklarované nebo uložené proměnné.
  • Dělené tabulky nemohou obsahovat cizí klíče ani na ně nelze odkazovat.
  • Je limit 1 024 oddílů na tabulku (od MariaDB 10.0.4 mohou tabulky obsahovat maximálně 8 192 oddílů).
  • Tabulku lze rozdělit na oddíly pouze v případě, že modul úložiště podporuje rozdělení.
  • Mezipaměť dotazů si není vědoma dělení nebo ořezávání oddílů.
  • Všechny oddíly musí používat stejný modul úložiště.
  • FullTEXT indexy nejsou podporovány
  • Dočasné tabulky nelze dělit

Výše uvedené možnosti by vám měly pomoci rozhodnout se, zda je pro vás dělení možností nebo ne.

Typy rozdělení

Pokud se rozhodnete používat oddíly, mějte na paměti, že máte na výběr z několika typů rozdělení. Níže stručně popíšeme vaše možnosti a poté se do nich ponoříme hlouběji:

  • Rozdělení podle RANGE vám může pomoci rozdělit řádky na základě hodnot sloupců spadajících do daného rozsahu.
  • Rozdělení podle LIST vám může pomoci rozdělit řádky na základě příslušnosti k hodnotám sloupců v daném seznamu.
  • Rozdělení pomocí HASH vám může pomoci rozdělit řádky na základě hodnoty vrácené uživatelem definovaným výrazem.
  • Rozdělení pomocí KEY vám může pomoci rozdělit řádky na základě hašovací funkce poskytované MySQL.

Rozdělení podle RANGE

Dělení podle RANGE je jednou z nejoblíbenějších forem dělení tabulek MySQL. Když rozdělíte tabulku podle RANGE, rozdělíte tabulku tak, že každý oddíl obsahuje určitý počet řádků, které spadají do daného rozsahu. Chcete-li definovat oddíl, definujte jeho název a poté mu řekněte, které hodnoty by měl obsahovat - pro rozdělení tabulky podle rozsahu přidejte příkaz PARTITION BY RANGE. Pokud byste například chtěli pojmenovat svůj oddíl p0 a zajistit, aby obsahoval každou hodnotu, která je menší než 5, musíte se ujistit, že váš dotaz obsahuje HODNOTY PARTITION p0 MENŠÍ NEŽ (5). Zde je příklad rozdělené tabulky:

CREATE TABLE sample_table (

id INT(255) NOT NULL AUTO_INCREMENT PRIMARY KEY,

column_name VARCHAR(255) NOT NULL DEFAULT ‘’

...

) PARTITION BY RANGE (column_name) (

PARTITION p0 VALUES LESS THAN (5),

PARTITION p1 VALUES LESS THAN (10),

PARTITION p2 VALUES LESS THAN (15),

PARTITION p3 VALUES LESS THAN (20),

...

);

Můžete také definovat oddíl, který obsahuje všechny hodnoty, které nespadají do určitých rozsahů, jako například:

PARTITION p5 VALUES LESS THAN MAXVALUE

Výše uvedený oddíl se jmenuje p5 a obsahuje všechny hodnoty, které ostatní oddíly nemají - MAXVALUE představuje hodnotu, která je vždy vyšší než největší možná hodnota. Můžete také použít funkce definováním oddílů takto:

PARTITION BY RANGE (YEAR(date)) (

    PARTITION p0 VALUES LESS THAN (2000),

    PARTITION p1 VALUES LESS THAN (2010),

    PARTITION p2 VALUES LESS THAN (2020),

    PARTITION p3 VALUES LESS THAN MAXVALUE

);

V tomto případě jsou všechny hodnoty menší než 2000 uloženy v oddílu p0, všechny hodnoty menší než 2010 jsou uloženy v oddílu p1, všechny hodnoty menší než 2020 jsou uloženy v oddíl p2 a všechny hodnoty, které nespadají do žádného z těchto rozsahů, jsou uloženy v oddílu p3.

Rozdělení podle LIST

Rozdělení tabulek MySQL podle LIST je podobné rozdělení podle RANGE – hlavní rozdíl v rozdělení tabulek pomocí LIST spočívá v tom, že když jsou tabulky rozděleny podle LIST, každý oddíl je definován a vybrán na základě členství hodnoty sloupce v sadě seznamů hodnot spíše než v rozsahu hodnot. Rozdělení podle SEZNAMU může být užitečné, když například víte, že máte data, která lze rozdělit do několika menších sad dat (řekněme regionů). Předpokládejme, že máte obchod, který má 4 franšízy:jednu v centrální části města, druhou na severu, třetí na východě, čtvrtou na západě. Tabulku můžete rozdělit tak, aby data patřící určité franšíze byla uložena v oddílu věnovaném této franšíze:

PARTITION BY LIST(store) (

PARTITION central VALUES IN (1,3,5),

PARTITION north VALUES IN (2,4,7),

PARTITION east VALUES IN (8,9),

PARTITION west VALUES IN (10,11)

);

Rozdělení podle HASH

Rozdělení tabulek MySQL pomocí HASH může být způsob, jak zajistit, aby data mezi oddíly byla distribuována rovnoměrně. Pokud rozdělujete tabulky pomocí HASH, musíte pouze určit, do kolika oblastí potřebujete, aby byla vaše data rozdělena - o zbytek se postará MySQL. Rozdělení pomocí HASH můžete použít přidáním následujícího příkazu do CREATE TABLE:

PARTITION BY HASH(id)

PARTITIONS 5;

Nahraďte 5 číslem, které určuje, do kolika oddílů potřebujete rozdělit data – výchozí číslo je 1.

MySQL také podporuje dělení pomocí LINEÁRNÍHO HASH – lineární hašování se liší od běžného hašování, protože lineární hašování využívá lineární algoritmus s mocninou dvou. Chcete-li rozdělovat tabulky pomocí LINEÁRNÍHO HASH, nahraďte PARTITION BY HASH za ROZDĚLENÍ PODLE LINEÁRNÍHO HASH.

Rozdělení podle KLÍČE

Rozdělení tabulek MySQL pomocí KEY je podobné rozdělení tabulek MySQL pomocí HASH - v tomto případě je funkce hash pro rozdělení klíčů poskytnuta serverem MySQL. Jakékoli sloupce, které se používají jako rozdělovací klíč, musí obsahovat primární klíč celé tabulky nebo být alespoň součástí primárního klíče tabulky. Pokud není jako rozdělovací klíč zadán žádný název sloupce, použije se primární klíč. Pokud neexistuje žádný primární klíč, ale existuje jedinečný klíč, použije se místo něj jedinečný klíč. Například následující příkazy jsou oba platné, i když první příkaz neuvádí ani rozdělovací klíč:

CREATE TABLE demo_table (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL DEFAULT ''
)
PARTITION BY KEY()
PARTITIONS 2;
CREATE TABLE demo_table (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
)
PARTITION BY KEY(id)
PARTITIONS 5;

Závěr

Abych to shrnul, oddíly mohou být užitečné, pokud máte hodně dat, vaše tabulky jsou příliš velké na to, aby se vešly do paměti nebo obsahují historická data. Oddíly mohou být také užitečné, pokud si myslíte, že budete potřebovat distribuovat obsah tabulky na různá paměťová média, a také pokud chcete mít možnost smazat nebo obnovit jednotlivé oddíly.

Mějte však na paměti, že oddíly v MySQL mají své nevýhody. Jednou z hlavních nevýhod rozdělení na oddíly je, že zvětší vaše stoly - nemůžete dosáhnout rychlosti bez kompromisů v prostoru. Pokud máte velmi velkou sadu dat, může to být docela velký problém.


  1. Změňte heslo pro přihlášení k serveru SQL

  2. Jak zaokrouhlovat čísla v SQL

  3. Jak používat tipy obrazovky Access 2019

  4. Jak funguje DAYOFYEAR() v MariaDB