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

Pochopení indexů v MySQL:Část třetí

Tento blogový příspěvek je třetí částí série blogů o indexech v MySQL . Ve druhé části série blogových příspěvků o indexech MySQL jsme se zabývali indexy a úložnými moduly a dotkli se některých ZÁKLADNÍCH KLÍČOVÝCH úvah. Diskuse zahrnovala, jak přiřadit předponu sloupce, některé úvahy o indexu FULLTEXT a jak byste měli používat indexy B-Tree se zástupnými znaky a jak používat ClusterControl ke sledování výkonu vašich dotazů a následně indexů.

 

V tomto příspěvku na blogu se podíváme na další podrobnosti o indexech v MySQL :probereme hash indexy, kardinalitu indexu, selektivitu indexu, řekneme si zajímavé podrobnosti o pokrytí indexů a projdeme si i některé strategie indexování. A samozřejmě se dotkneme funkce ClusterControl. Začneme, ano?

Hash indexy v MySQL

MySQL DBA a vývojáři zabývající se MySQL mají také další trik v rukávu, pokud jde o MySQL - hash indexy jsou také možností. Hash indexy se často používají v MEMORY enginu MySQL – stejně jako téměř vše v MySQL, i tyto druhy indexů mají své klady a zápory. Hlavní nevýhodou těchto druhů indexů je, že se používají pouze pro srovnání rovnosti, která používají operátory =nebo <=>, což znamená, že nejsou opravdu užitečné, pokud chcete hledat rozsah hodnot, ale hlavní výhodou je že vyhledávání je velmi rychlé. Mezi další nevýhody patří skutečnost, že vývojáři nemohou k vyhledání řádků použít žádnou předponu klíče zcela vlevo (pokud to chcete udělat, použijte indexy B-Stromu), skutečnost, že MySQL nedokáže přibližně určit, kolik řádků existuje. mezi dvěma hodnotami - pokud se používají hash indexy, nemůže optimalizátor použít ani hash index ke zrychlení operací ORDER BY. Mějte na paměti, že hash indexy nejsou jedinou věcí, kterou modul MEMORY podporuje – motory MEMORY mohou mít také indexy B-Stromu.

Kardinálnost indexu v MySQL

Pokud jde o indexy MySQL, můžete také slyšet jiný termín - tento termín se nazývá kardinalita indexu. Velmi zjednodušeně řečeno, kardinalita indexu odkazuje na jedinečnost hodnot uložených ve sloupci, který používá index. Chcete-li zobrazit mohutnost indexu konkrétního indexu, můžete jednoduše přejít na kartu Struktura v phpMyAdmin a sledovat informace tam, nebo můžete také provést dotaz SHOW INDEXES:

mysql> SHOW INDEXES FROM demo_table;
+---------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table         | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| demo_table |          1 | demo     |            1 | demo        | A         |      494573 |     NULL | NULL   |      | BTREE      |         |               |
+---------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.00 sec)

Výstup dotazu SHOW INDEXES, který můžete vidět výše, má mnoho polí, z nichž jedno znázorňuje mohutnost indexu:toto pole vrací odhadovaný počet jedinečných hodnot v indexu – čím vyšší mohutnost, tím větší šance, že optimalizátor dotazů použije index pro vyhledávání. Jak bylo řečeno, indexová kardinalita má také bratra - jmenuje se indexová selektivita.

Selektivita indexu v MySQL

Selektivita indexu je počet odlišných hodnot ve vztahu k počtu záznamů v tabulce. Jednoduše řečeno, selektivita indexu definuje, jak pevně databázový index pomáhá MySQL zúžit hledání hodnot. Ideální indexová selektivita je hodnota 1. Indexová selektivita se vypočítá vydělením odlišných hodnot v tabulce celkovým počtem záznamů, například pokud máte v tabulce 1 000 000 záznamů, ale pouze 100 000 z nich jsou odlišné hodnoty. , vaše indexová selektivita bude 0,1. Pokud máte v tabulce 10 000 záznamů a 8 500 z nich jsou odlišné hodnoty, selektivita indexu by byla 0,85. to je mnohem lepší. Chápeš pointu. Čím vyšší je selektivita vašeho indexu, tím lépe.

Pokrytí indexů v MySQL

Pokrývající index je speciální druh indexu v InnoDB. Když se používá krycí index, všechna požadovaná pole pro dotaz jsou zahrnuta nebo „pokryta“ indexem, což znamená, že můžete také využít výhod čtení pouze indexu namísto dat. Pokud nic jiného nepomůže, krycí index může být vaší vstupenkou ke zlepšení výkonu. Některé z výhod používání krycích indexů zahrnují:

  • Jedním z hlavních scénářů, kde by mohl být použit krycí index, je poskytování dotazů bez dalších I/O čtení na velkých stolech.

  • MySQL má také přístup k méně datům, protože položky indexu jsou menší než velikost řádků.

  • Většina úložišť indexuje indexy lépe než data.

Vytváření krycích indexů v tabulce je velmi jednoduché – jednoduše zakryjte pole, ke kterým mají přístup klauzule SELECT, WHERE a GROUP BY:

ALTER TABLE demo_table ADD INDEX index_name(column_1, column_2, column_3);

Mějte na paměti, že při práci s indexy je velmi důležité zvolit správné pořadí sloupců v indexu. Aby byly vaše krycí indexy účinné, umístěte nejprve sloupce, které používáte s klauzulemi WHERE, dále ORDER BY a GROUP BY a sloupce použité s klauzulí SELECT umístěte jako poslední.

Strategie indexování v MySQL

Řízení se rad obsažených v těchto třech částech blogových příspěvků o indexech v MySQL vám může poskytnout opravdu dobrý základ, ale existuje také několik strategií indexování, které byste mohli chtít použít skutečně využijte sílu indexů ve vaší architektuře MySQL. Aby vaše indexy vyhovovaly osvědčeným postupům MySQL, zvažte:

  1. Izolace sloupce, na kterém používáte index - obecně MySQL nepoužívá indexy, pokud sloupce se používají na nejsou izolované. Takový dotaz by například nepoužil index, protože není izolovaný:

    SELECT demo_column FROM demo_table WHERE demo_id + 1 = 10;


    Takový dotaz by však:
     

    SELECT demo_column FROM demo_table WHERE demo_id = 10;

  2. Nepoužívejte indexy u sloupců, které indexujete. Například použití podobného dotazu by moc neprospělo, takže je lepší se takovým dotazům vyhnout, pokud můžete:
     

    SELECT demo_column FROM demo_table WHERE TO_DAYS(CURRENT_DATE) - TO_DAYS(column_date) <= 10;

  3. Pokud používáte dotazy LIKE společně s indexovanými sloupci, nevkládejte zástupný znak na začátek vyhledávacího dotazu, protože tak ani MySQL nebude používat index. To je místo psaní dotazů jako je tento:

    SELECT * FROM demo_table WHERE demo_column LIKE ‘%search query%’;


    Zkuste je napsat takto:

    SELECT * FROM demo_table WHERE demo_column LIKE ‘search_query%’;


    Druhý dotaz je lepší, protože MySQL ví, čím sloupec začíná, a dokáže efektivněji využívat indexy. Stejně jako u všeho může být příkaz EXPLAIN velkou pomocí, pokud se chcete ujistit, že vaše indexy skutečně používá MySQL.

Použití ClusterControl k udržení výkonu vašich dotazů

Pokud chcete zlepšit výkon MySQL, výše uvedené rady by vás měly nasměrovat na správnou cestu. Pokud máte pocit, že potřebujete něco víc, zvažte ClusterControl for MySQL. Jednou z věcí, s nimiž vám ClusterControl může pomoci, je správa výkonu – jak již bylo uvedeno v předchozích příspěvcích na blogu, ClusterControl vám také může pomoci s tím, aby vaše dotazy fungovaly co nejlépe po celou dobu – je to proto, že ClusterControl obsahuje také dotaz monitor, který vám umožní sledovat výkon vašich dotazů, vidět pomalé, dlouhotrvající dotazy a také odlehlé hodnoty dotazů, které vás upozorňují na možná úzká hrdla ve výkonu vaší databáze dříve, než si jich sami všimnete:

Můžete dokonce filtrovat své dotazy, což vám umožní vytvořit předpoklad, zda index byl nebo nebyl použit individuálním dotazem:

ClusterControl může být skvělým nástrojem ke zlepšení výkonu vaší databáze a zároveň vám odpadne starosti s údržbou. Chcete-li se dozvědět více o tom, co může ClusterControl udělat pro zlepšení výkonu vašich instancí MySQL, zvažte možnost podívat se na stránku ClusterControl for MySQL.

Shrnutí

Jak už asi víte, indexy v MySQL jsou velmi složité zvíře. Chcete-li vybrat nejlepší index pro svou instanci MySQL, vědět, co jsou indexy a co dělají, znát typy indexů MySQL, znát jejich výhody a nevýhody, vzdělávat se o tom, jak indexy MySQL interagují s úložnými enginy, podívejte se také na ClusterControl pro MySQL, pokud máte pocit, že automatizace určitých úloh souvisejících s indexy v MySQL by vám mohla usnadnit den.


  1. 6 zábavných faktů o společnosti Microsoft, které pravděpodobně neznáte!

  2. Jak přidat komentáře do tabulky v Oracle SQL Developer?

  3. Jak chránit databázi heslem v Accessu 2016

  4. MariaDB GROUP_CONCAT()