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

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

Indexy v MySQL jsou velmi složité zvíře. V minulosti jsme se zabývali indexy MySQL, ale nikdy jsme se do nich hlouběji neponořili – uděláme to v této sérii blogových příspěvků. Tento blogový příspěvek by měl fungovat jako velmi obecný průvodce indexy, zatímco ostatní díly této série se do těchto témat ponoří trochu hlouběji.

Co jsou indexy?

Obecně, jak již bylo uvedeno v předchozím příspěvku na blogu o indexech, index je abecední seznam záznamů s odkazy na stránky, na kterých jsou zmíněny. V MySQL je index datová struktura, která se nejčastěji používá k rychlému nalezení řádků. Můžete také slyšet výraz „klíče“ – odkazuje také na indexy.

Co indexy dělají?

V MySQL se indexy používají k rychlému nalezení řádků s konkrétními hodnotami sloupců a k zabránění čtení celé tabulky za účelem nalezení řádků relevantních pro dotaz. Indexy se většinou používají, když se data uložená v databázovém systému (například MySQL) zvětší, protože čím větší je tabulka, tím větší je pravděpodobnost, že budete mít z indexů prospěch.

Typy indexů MySQL

Pokud jde o MySQL, možná jste slyšeli o tom, že má několik typů indexů:

  • INDEX B-stromu – takový index se často používá k urychlení SELECT dotazů odpovídajících klauzuli WHERE. Takový index lze použít pro pole, kde hodnoty nemusí být jedinečné, ale také přijímá hodnoty NULL.

  • FULLTEXTOVÝ INDEX – takový index se používá k využití možností fulltextového vyhledávání. Tento typ indexu vyhledá klíčová slova v textu namísto přímého porovnávání hodnot s hodnotami v indexu.

  • JEDINEČNÝ INDEX se často používá k odstranění duplicitních hodnot z tabulky. Vynucuje jedinečnost hodnot řádků.

  • PRIMÁRNÍ KLÍČ je také index – často se používá spolu s poli s atributem AUTO_INCREMENT. Tento typ indexu nepřijímá hodnoty NULL a po nastavení nelze hodnoty ve sloupci, který má PRIMÁRNÍ KLÍČ, změnit.

  • SESTUPNÝ INDEX je index, který ukládá řádky v sestupném pořadí. Tento typ indexu byl zaveden v MySQL 8.0 – MySQL použije tento typ indexu, když dotaz požaduje sestupné pořadí.

Výběr optimálních datových typů pro indexy v MySQL

Pokud jde o indexy, je také potřeba mít na paměti, že MySQL podporuje širokou škálu datových typů a některé datové typy nelze použít společně s určitými druhy indexů (například FULLTEXT indexy lze použít pouze na textové sloupce (CHAR, VARCHAR nebo TEXT) – nelze je použít na žádné jiné datové typy), takže před skutečným výběrem indexů pro návrh databáze se rozhodněte, jaký datový typ budete používat dotyčný sloupec (rozhodněte se, jakou datovou třídu budete ukládat:budete ukládat čísla? Řetězcové hodnoty? Čísla i řetězcové hodnoty? atd.), poté rozhodněte o rozsahu hodnot, které chcete uložit (vyberte ten, o kterém si nemyslíte, že ho překročíte, protože zvýšení rozsahu datových typů může být později časově náročný úkol – doporučujeme zvolit jednoduchý datový typ), a pokud nehodláte používat NULL hodnoty ve sloupcích, určete pole jako NOT NULL, kdykoli je to možné – pokud je co lumn je indexován, vyžaduje další bajt na položku.

Výběr optimálních znakových sad a řazení pro indexy v MySQL

Kromě datových typů mějte také na paměti, že každý znak v MySQL zabírá místo. Například znaky UTF-8 mohou mít každý 1 až 4 bajty, takže se možná budete chtít vyhnout indexování například 255 znaků a použít pouze řekněme 50 nebo 100 znaků pro určitý sloupec.

Výhody a nevýhody používání indexů v MySQL

Hlavní výhodou použití indexů v MySQL je vyšší výkon vyhledávacích dotazů vyhovujících klauzuli WHERE – indexy urychlují SELECT dotazy vyhovující klauzuli WHERE, protože MySQL nečte celou tabulku, aby nalezla řádky relevantní pro dotaz. Mějte však na paměti, že indexy mají své nevýhody. Hlavní jsou následující:

  • Indexy zabírají místo na disku.

  • Indexy snižují výkon dotazů INSERT, UPDATE a DELETE – když jsou data aktualizována, index musí být aktualizovány společně s ním.

  • MySQL vás nechrání před používáním více typů indexů současně. Jinými slovy, ve stejném sloupci můžete použít PRIMÁRNÍ KLÍČ, INDEX a UNIKÁTNÍ INDEX – MySQL vás před takovou chybou nechrání.

Pokud máte podezření, že se některé z vašich dotazů zpomalují, zvažte možnost podívat se na kartu Monitor dotazů v ClusterControl – povolením sledování dotazů uvidíte, kdy byl určitý dotaz naposledy viděn, a jeho maximum a průměrnou dobu provádění, která vám může pomoci vybrat nejlepší indexy pro vaši tabulku.

Jak vybrat nejlepší index k použití?

Chcete-li vybrat nejlepší index k použití, můžete použít vestavěné mechanismy MySQL. Můžete například použít vysvětlovač dotazů – dotaz EXPLAIN. Vysvětlí, jaká tabulka se používá, zda má nebo nemá oddíly, jaké indexy je možné použít a jaký klíč (index) se používá. Vrátí také délku indexu a počet řádků, které váš dotaz vrátí:

mysql> EXPLAIN SELECT * FROM demo_table WHERE demo_field = ‘demo’\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: demo_table
   partitions: NULL
         type: ref
possible_keys: demo_field
          key: demo_field
      key_len: 1022
          ref: const
         rows: 1
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)

V tomto případě mějte na paměti, že indexy se často používají k tomu, aby pomohly MySQL efektivně načíst data, když jsou datové sady větší než obvykle. Pokud je vaše tabulka malá, možná nebudete muset používat indexy, ale pokud zjistíte, že se vaše tabulky zvětšují a zvětšují, je pravděpodobné, že byste mohli mít z indexu prospěch.

Chcete-li však vybrat nejlepší index pro použití pro váš konkrétní scénář, mějte na paměti, že indexy mohou být také hlavní příčinou problémů s výkonem. Mějte na paměti, že to, zda MySQL bude efektivně používat indexy nebo ne, závisí na několika faktorech, včetně návrhu vašich dotazů, používaných indexů, typů používaných indexů, také zatížení vaší databáze v době provádění dotazu a jiné věci. Zde je několik věcí, které je třeba zvážit při používání indexů v MySQL:

  • Kolik dat máte? Možná jsou některé z nich nadbytečné?

  • Jaké dotazy používáte? Používaly by vaše dotazy klauzule LIKE? A co objednání?

  • Jaký druh indexu byste potřebovali použít ke zlepšení výkonu svých dotazů?

  • Byly by vaše indexy velké nebo malé? Potřebovali byste použít index na prefixu sloupce, aby se jeho velikost zmenšila?

Stojí za zmínku, že byste se pravděpodobně měli vyvarovat používání více typů indexů (např. index B-stromu, UNIQUE INDEX a PRIMARY KEY) ve stejném sloupci.

Zlepšení výkonu dotazů pomocí indexů

Chcete-li zlepšit výkon dotazů pomocí indexů, musíte se podívat na své dotazy – s tím vám může pomoci příkaz EXPLAIN. Obecně platí, že pokud chcete, aby vaše indexy zlepšily výkon vašich dotazů, měli byste zvážit několik věcí:

  • Požádejte databázi pouze o to, co potřebujete. Ve většině případů bude použití sloupce SELECT rychlejší než použití SELECT * (to je případ i bez použití indexů)

  • Pokud hledáte přesné hodnoty, může být vhodný index B-stromu (např. SELECT * FROM demo_table WHERE some_field ='x'), nebo pokud chcete hledat hodnoty pomocí zástupných znaků (např. SELECT * FROM demo_table WHERE some_field LIKE 'demo%' - v tomto případě mějte na paměti, že použití dotazů LIKE s čímkoli na začátku může stačit více škody než užitku – vyhněte se používání dotazů LIKE se znakem procenta před textem, který hledáte – tímto způsobem MySQL nemusí používat index, protože neví, čím začíná hodnota řádku) – i když mějte na paměti že index B-stromu lze také použít pro srovnání sloupců ve výrazech, které používají rovno (=), více než (>), větší nebo rovno (>=), menší než (<), menší nebo rovno (<=) nebo BETWEEN operátory.

  • Fulltextový index se může hodit, pokud zjistíte, že používáte fulltext (MATCH ... PROTI( )) vyhledávací dotazy nebo pokud je vaše databáze navržena tak, že používá pouze textové sloupce - FULLTEXTOVÉ indexy mohou používat sloupce TEXT, CHAR nebo VARCHAR, nelze je použít na žádné jiné typy sloupců.

  • Pokrývající index může být užitečný, pokud chcete spouštět dotazy bez dalších I/O čtení na velkých tabulkách . Chcete-li vytvořit krycí index, zakryjte klauzule WHERE, GROUP BY a SELECT použité v dotazu.

Typy indexů se dále podíváme v nadcházejících dílech této série blogů, ale obecně platí, že pokud používáte dotazy jako SELECT * FROM demo_table WHERE some_field ='x' INDEX B-stromu může být vhodné, pokud používáte dotazy MATCH() AGAINST(), pravděpodobně byste se měli podívat na FULLTEXTOVÝ index, pokud má vaše tabulka velmi dlouhé hodnoty řádků, pravděpodobně byste se měli podívat na indexování části sloupce.

Kolik indexů byste měli mít?

Pokud jste někdy používali indexy ke zlepšení výkonu svých SELECT dotazů, pravděpodobně jste si položili otázku:kolik indexů byste vlastně měli mít? Abyste tomu porozuměli, musíte mít na paměti následující věci:

  1. Indexy jsou obvykle nejúčinnější s velkým množstvím dat.

  2. MySQL používá pouze jeden index na každý příkaz SELECT v dotazu (poddotazy jsou považovány za samostatné příkazy) - použijte dotaz EXPLAIN, abyste zjistili, které indexy jsou pro vámi používané dotazy nejúčinnější.

  3. Indexy by měly provádět všechny vaše příkazy SELECT dostatečně rychle, aniž by příliš ohrozily místo na disku – „dostatečně rychlé“ , je však relativní, takže budete muset experimentovat.

Indexy a úložiště

Při práci s indexy v MySQL také mějte na paměti, že pokud používáte různé motory, mohou existovat určitá omezení (například pokud používáte MyISAM na rozdíl od InnoDB). Podrobněji se budeme věnovat v samostatném blogu, ale zde jsou některé nápady:

  • Maximální počet indexů na tabulky MyISAM a InnoDB je 64, maximální počet sloupců na index v obou úložných motorů je 16.

  • Maximální délka klíče pro InnoDB je 3500 bajtů – maximální délka klíče pro MyISAM je 1000 bajtů.

  • P>
  • Fulltextové indexy mají omezení v určitých úložištích – například fulltextové indexy InnoDB mají 36 ignorovaných slov, MyISAM seznam stopwords je o něco větší se 143 stopwords. InnoDB odvozuje tato ignorovaná slova z proměnné innodb_ft_server_stopword_table, zatímco MyISAM odvozuje tato ignorovaná slova ze souboru storage/myisam/ft_static.c – všechna slova nalezená v souboru budou považována za ignorovaná slova.

  • MyISAM byl jediný úložný modul s podporou možností fulltextového vyhledávání až do MySQL 5.6 (MySQL 5.6. 4), abych byl přesný), což znamená, že InnoDB podporuje fulltextové indexy od MySQL 5.6.4. Když se používá FULLTEXTOVÝ index, najde klíčová slova v textu namísto přímého porovnávání hodnot s hodnotami v indexu.

  • Indexy hrají pro InnoDB velmi důležitou roli – InnoDB zamyká řádky, když k nim přistupuje, takže se snižuje počet řádky Přístupy InnoDB mohou omezit zámky.

  • MySQL umožňuje používat duplicitní indexy ve stejném sloupci.

  • Některé moduly úložiště mají určité výchozí typy indexů (např. pro modul úložiště MEMORY je výchozím typem indexu hash )

Shrnutí

V této části o indexech v MySQL jsme prošli některými obecnými věcmi souvisejícími s indexy v tomto systému správy relačních databází. V nadcházejících příspěvcích na blogu si projdeme několik podrobnějších scénářů používání indexů v MySQL, včetně použití indexů v určitých úložných strojích atd. – také vysvětlíme, jak lze použít ClusterControl k dosažení vašich výkonnostních cílů v MySQL.


  1. Jak zkopírovat data velké tabulky do jiné tabulky v SQL Server

  2. SQL Server Vložit, pokud neexistuje

  3. Vraťte den, měsíc a rok v MySQL

  4. Jak vypočítat tržby v MySQL