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

Pochopení indexů v MySQL:Část druhá

Tento blogový příspěvek je druhou částí série blogů o indexech v MySQL. V první části série blogových příspěvků o indexech MySQL jsme se zabývali mnoha věcmi, včetně toho, co jsou, co dělají, jaké jsou jejich typy, jak vybrat optimální datové typy a znakové sady MySQL pro indexy, které používáte. . Prošli jsme si výhody a nevýhody používání indexů v MySQL; řekli jsme vám, jak vybrat nejlepší index k použití, jak zlepšit výkon dotazů a zajistit, aby MySQL používal vaše indexy, kolik indexů byste měli mít. Prošli jsme také některé úvahy týkající se úložných motorů. Tento blogový příspěvek se bude podrobněji zabývat některým obsahem, o kterém jsme diskutovali v první části série. Začneme korelací mezi indexy a storage engine v MySQL.

Indexy a úložiště v MySQL

Jak jsme již zmínili v předchozím příspěvku na blogu, mohou existovat určitá omezení pro indexy a další věci, pokud v MySQL používáte určité úložiště. Zde jsou některé z nich - nyní definujeme, co některé z nich jsou (některé z nich byly popsány v prvním díle blogové série, takže pokud nám něco chybí, pravděpodobně to tam je), pak je popište podrobněji analýza:

  • Podle dokumentace MySQL je maximální počet indexů, maximální délka klíče a maximální délka indexu definované pro každý úložný stroj. Jak jsme již zmínili v předchozím příspěvku na blogu, maximální počet indexů na tabulky MyISAM a InnoDB je 64, maximální počet sloupců na index v obou úložných enginech je 16, maximální délka klíče pro InnoDB je 3500 bajtů a maximální délka klíče pro MyISAM je 1000 bajtů.

  • K vytvoření PRIMÁRNÍHO KLÍČE nelze použít CREATE INDEX – místo toho použijte ALTER TABLE.

  • Sloupce BLOB a TEXT lze indexovat pouze pro tabulky se spuštěnými úložnými moduly InnoDB, MyISAM a BLACKHOLE.

  • Pokud indexujete pouze prefix sloupce, mějte na paměti, že podpora prefixu a jejich délka jsou také závislé na skladovacích motorech. Předpona může být dlouhá až 767 bajtů pro tabulky InnoDB, které používají formát řádků REDUNDANTNÍ nebo KOMPAKTNÍ, ale pro formáty řádků DYNAMIC nebo COMPRESSED je limit délky předpony zvýšen na 3072 bajtů. Pro tabulky MyISAM je limit délky prefixu 1000 bajtů. Úložný modul NDB vůbec nepodporuje předpony.

  • Pokud je povolen přísný režim SQL a předpona indexu překračuje maximální velikost datového typu sloupce, funkce CREATE INDEX vyvolá chyba. Pokud není povolen přísný režim SQL, CREATE INDEX zobrazí varování. Pokud je vytvořen UNIQUE INDEX, dojde k chybě.

  • Obecně vám MySQL umožňuje vytvořit až 16 indexů v dané tabulce.

  • Pokud používáte index PRIMÁRNÍHO KLÍČE, můžete mít pouze jeden primární klíč na tabulku. FULLTEXT, UNIQUE INDEXy a INDEXy toto omezení nemají.

  •  Pokud používáte FULLTEXTOVÉ indexy, mějte na paměti, že je lze použít pouze pro úložiště InnoDB nebo MyISAM a pro sloupce CHAR, VARCHAR nebo TEXT. Také mějte na paměti, že MySQL používá FULLTEXT indexy pouze tehdy, když jsou použity klauzule MATCH() AGAINST() a že ve skutečnosti můžete mít index a fulltextový index ve stejném sloupci současně, pokud si to přejete a že FULLTEXT indexy mají své vlastní sadu ignorovaných slov, z nichž každé je specifické pro používané úložiště.

  • Indexy B-stromu mohou být užitečné, pokud používáte dotazy LIKE, které začínají zástupným znakem, ale pouze v určitých scénáře.

Znát tato omezení indexů by se mělo ukázat jako užitečné, pokud se snažíte pochopit, jak indexy v MySQL fungují. Ještě důležitější je však pochopit, že musíte ověřit, že vaše indexy skutečně používá MySQL. Krátce jsme se toho dotkli v první části této série („Jak vybrat nejlepší index k použití?“), ale neřekli jsme vám, jak ověřit, že vaše indexy skutečně používá MySQL. Chcete-li to provést, ověřte jejich použití pomocí EXPLAIN - když je EXPLAIN použit společně s vysvětlitelným příkazem, MySQL zobrazí informace z optimalizátoru o plánu provádění příkazu.

PRIMÁRNÍ KLÍČOVÉ úvahy

Některé ze základních úvah týkajících se indexů PRIMARY KEY v MySQL zahrnují skutečnost, že se primárně používají k jedinečné identifikaci záznamů v tabulce a často se používají s hodnotami AUTO_INCREMENTing, což znamená, že mohou být velmi užitečné, pokud vytváříte, řekněme, pole ID. Pole PRIMARY KEY musí obsahovat jedinečné hodnoty a nemohou obsahovat hodnoty NULL.

Přiřazení předpony sloupce

Indexy se také mohou shodovat s předponou sloupce. Tento přístup k indexům může být užitečný, pokud jsou vaše sloupce řetězcové a myslíte si, že přidání indexu na celý sloupec by potenciálně spotřebovalo hodně místa na disku. Vaše indexy se mohou shodovat s předponou sloupce takto:

ALTER TABLE demo_table ADD INDEX index_name(column_name(length));

Výše uvedený dotaz by přidal index index_name do sloupce s názvem column_name pouze pro definovanou předponu sloupce. Chcete-li zvolit vhodnou délku indexování, ujistěte se, že použití předpony maximalizuje jedinečnost hodnot ve sloupci:zjistěte počet řádků v tabulce a vyhodnoťte různé délky předpon, dokud nedosáhnete požadované jedinečnosti řádků.

FULLTEXTOVÉ indexy v MySQL

FULLTEXT indexy v MySQL jsou úplně jiné zvíře. Mají mnoho jedinečných omezení (například InnoDB má seznam ignorovaných slov složený z 36 slov, zatímco seznam stopwordů MyISAM se skládá ze 143 slov), mají také jedinečné režimy vyhledávání. Některé z nich obsahují režim přirozeného jazyka (pro aktivaci takového vyhledávacího režimu spusťte FULLTEXTOVÝ vyhledávací dotaz bez modifikátorů), můžete také rozšířit své vyhledávání (k tomu použijte modifikátor S ROZŠÍŘENÍM DOTAZU - takový režim vyhledávání provede hledejte dvakrát, ale když se vyhledávání spustí podruhé, obsahuje několik nejrelevantnějších záznamů z prvního vyhledávání (často se používá, když uživatel něco naznačí), pro vyhledávání pomocí booleovských operátorů použijte modifikátor IN BOOLEAN MODE. FULLTEXT indexy budou také použity pouze v případě, že vyhledávací dotaz obsahuje minimálně tři znaky pro InnoDB a minimálně čtyři znaky pro MyISAM.

Použití indexů B-stromu se zástupnými znaky

Indexy se také často používají, pokud vytváříte něco podobného jako vyhledávače. K tomu často chcete vyhledat pouze část hodnoty a vrátit výsledky – zde se používají zástupné znaky. Jednoduchý dotaz používající zástupný znak používá dotaz LIKE a znak % k označení „cokoli“ za textem. Například dotaz, jako je tento, vyhledá výsledky začínající slovem „hledat“ a po něm cokoliv:

SELECT * FROM … WHERE demo_column LIKE ‘search%’;

Takový dotaz by hledal výsledky začínající čímkoli, obsahující slovo „hledat“ a cokoli za ním:

SELECT * FROM … WHERE demo_column LIKE ‘%search%’;

Ale je tu háček – výše uvedený dotaz nebude používat index. Proč? Protože má na začátku zástupný znak a MySQL nemůže přijít na to, čím musí sloupec začít. Proto jsme řekli, že indexy zástupných znaků mají své místo, ale pouze ve specifických scénářích – tedy takových, kdy na začátku vyhledávacího dotazu nemáte zástupný znak.

Použití ClusterControl ke sledování výkonu dotazů

Kromě použití EXPLAIN můžete také použít ClusterControl ke sledování výkonu vašich dotazů:ClusterControl poskytuje sadu pokročilých funkcí monitorování a vytváření sestav, které vám umožní sledovat výkon vašich databázových instancí a dotazů . Klikněte například na cluster a zobrazí se karta „Monitor dotazů“. Klikněte na něj a ClusterControl vám umožní sledovat stav vašich dotazů v instancích databáze:

Tato část ClusterControl vám umožňuje zobrazit seznam nejlepších pomalých a dlouhých spouštění dotazů a zároveň umožňuje jejich filtrování. Pokud například víte, že jste nedávno spustili dotaz obsahující @@log_bin, můžete tento výraz jednoduše vyhledat a ClusterControl vrátí seznam výsledků:

Jak jste si pravděpodobně všimli, můžete také filtrovat dotazy podle hostitelů, které používáte nebo podle výskytů můžete také zvolit zobrazení sady řádků, například 20, 100 nebo 200. ClusterControl vám také sdělí, kdy byl dotaz naposledy viděn, jaká byla jeho celková doba provedení, kolik řádků vrátil, kolik řádků zkoumal a tak dále. ClusterControl se může ukázat jako nástroj, pokud chcete sledovat, jak vaše indexy skutečně používají instance MySQL, MariaDB, MongoDB, PostgreSQL nebo TimescaleDB.

Shrnutí

V tomto blogovém příspěvku jsme prošli některými omezeními a výhodami týkajícími se indexů v MySQL a také jsme se zabývali tím, jak vám může ClusterControl pomoci dosáhnout vašich cílů výkonu databáze. Budeme mít také třetí část o indexech v MySQL, která se do nich ponoří ještě hlouběji, ale abychom uzavřeli to, co jsme dosud probrali, mějte na paměti, že indexy v MySQL mají určitě své vlastní místo – abyste z nich vytěžili to nejlepší, jak interagují s úložnými moduly, jejich výhody a omezení, jak a kdy používat určité typy indexů a vybírat moudře.


  1. Jak funguje LOAD_FILE() v MariaDB

  2. Systémové databáze SQL Server – údržba MSDB

  3. Příznaky nad hlavou pozorovatele a typu čekání

  4. Vkládání dat SQL Serveru do Salesforce pomocí kurzoru