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

Nativní podpora JSON v MYSQL 5.7:jaké jsou výhody a nevýhody datového typu JSON v MYSQL?

SELECT * FROM t1
WHERE JSON_EXTRACT(data,"$.series") IN ...

Použití sloupce uvnitř výrazu nebo funkce, jako je tato, zkazí jakoukoli šanci dotazu pomocí indexu k optimalizaci dotazu. Výše uvedený dotaz je nucen provést skenování tabulky.

Tvrzení o „efektivním přístupu“ je zavádějící. To znamená, že poté, co dotaz prozkoumá řádek s dokumentem JSON, může extrahovat pole, aniž by musel analyzovat text syntaxe JSON. K vyhledání řádků však stále trvá skenování tabulky. Jinými slovy, dotaz musí prozkoumat každý řádek.

Analogicky, když hledám v telefonním seznamu lidi s křestním jménem "Bill", stále musím číst každou stránku v telefonním seznamu, i když byla křestní jména zvýrazněna, aby je bylo možné najít o něco rychleji.

MySQL 5.7 vám umožňuje definovat virtuální sloupec v tabulce a poté vytvořit index na virtuálním sloupci.

ALTER TABLE t1
  ADD COLUMN series AS (JSON_EXTRACT(data, '$.series')),
  ADD INDEX (series);

Pokud pak zadáte dotaz na virtuální sloupec, může použít index a vyhnout se prohledávání tabulky.

SELECT * FROM t1
WHERE series IN ...

To je hezké, ale trochu to postrádá smysl použití JSON. Atraktivní součástí použití JSON je, že vám umožňuje přidávat nové atributy, aniž byste museli provádět ALTER TABLE. Ale ukázalo se, že pokud chcete prohledávat pole JSON pomocí indexu, musíte stejně definovat další (virtuální) sloupec.

Ale nemusíte definovat virtuální sloupce a indexy pro každý pole v dokumentu JSON – pouze ty, které chcete vyhledávat nebo třídit. V JSON mohou být další atributy, které stačí extrahovat v seznamu výběru, jako jsou následující:

SELECT JSON_EXTRACT(data, '$.series') AS series FROM t1
WHERE <other conditions>

Obecně bych řekl, že je to nejlepší způsob, jak používat JSON v MySQL. Pouze ve výběrovém seznamu.

Když odkazujete na sloupce v jiných klauzulích (JOIN, WHERE, GROUP BY, HAVING, ORDER BY), je efektivnější používat konvenční sloupce, nikoli pole v dokumentech JSON.

Prezentoval jsem přednášku s názvem Jak používat JSON v MySQL Špatně na konferenci Percona Live v dubnu 2018. Přednášku aktualizuji a zopakuji na podzim na Oracle Code One.

S JSON jsou další problémy. Například v mých testech to vyžadovalo 2-3krát více úložného prostoru pro dokumenty JSON ve srovnání s konvenčními sloupci ukládajícími stejná data.

MySQL agresivně propaguje své nové schopnosti JSON, především proto, aby lidi odradilo od migrace na MongoDB. Ale úložiště dat orientované na dokumenty, jako je MongoDB, je v zásadě nerelační způsob organizace dat. Je to jiné než vztahové. Neříkám, že jeden je lepší než druhý, je to jen jiná technika, vhodná pro různé typy dotazů.

Pokud JSON zefektivní vaše dotazy, měli byste se rozhodnout používat JSON.

Nevolte technologii jen proto, že je nová, nebo kvůli módě.

Edit:Implementace virtuálního sloupce v MySQL má používat index, pokud vaše klauzule WHERE používá přesně stejný výraz jako definice virtuálního sloupce. To znamená, že by mělo použijte index na virtuálním sloupci, protože virtuální sloupec je definován AS (JSON_EXTRACT(data,"$.series"))

SELECT * FROM t1
WHERE JSON_EXTRACT(data,"$.series") IN ...

Až na to, že jsem testováním této funkce zjistil, že z nějakého důvodu NEFUNGUJE, pokud je výraz funkcí extrakce JSON. Funguje to pro jiné typy výrazů, jen ne pro funkce JSON. AKTUALIZACE:toto údajně konečně funguje v MySQL 5.7.33.



  1. Výběrový dotaz s limitem posunu je příliš pomalý

  2. SQL Server 2017:Dostupné funkce v systému Linux

  3. Změnit primární klíč

  4. Rozdělte data sloupců oddělených čárkami do dalších sloupců