MariaDB
 sql >> Base de Dados >  >> RDS >> MariaDB

Entendendo Índices no MySQL:Parte Três

Esta postagem do blog é a terceira parte da série de blogs sobre índices no MySQL . Na segunda parte da série de postagens do blog sobre índices MySQL, abordamos índices e mecanismos de armazenamento e abordamos algumas considerações PRIMARY KEY. A discussão incluiu como corresponder um prefixo de coluna, algumas considerações sobre o índice FULLTEXT e como você deve usar índices B-Tree com curingas e como usar ClusterControl para monitorar o desempenho de suas consultas e, posteriormente, os índices.


Nesta postagem do blog, entraremos em mais detalhes sobre índices no MySQL :abordaremos índices de hash, cardinalidade do índice, seletividade do índice, contaremos detalhes interessantes sobre a cobertura de índices e também passaremos por algumas estratégias de indexação. E, claro, falaremos sobre ClusterControl. Vamos começar, vamos?

Índices de hash no MySQL

DBAs MySQL e desenvolvedores que lidam com MySQL também têm outro truque na manga no que diz respeito ao MySQL - índices de hash também são uma opção. Índices de hash são frequentemente usados ​​no mecanismo MEMORY do MySQL - como quase tudo no MySQL, esses tipos de índices têm suas próprias vantagens e desvantagens. A principal desvantagem desses tipos de índices é que eles são usados ​​apenas para comparações de igualdade que usam os operadores =ou <=>, o que significa que eles não são realmente úteis se você quiser pesquisar um intervalo de valores, mas a principal vantagem é que as pesquisas são muito rápidas. Mais algumas desvantagens incluem o fato de que os desenvolvedores não podem usar nenhum prefixo mais à esquerda da chave para encontrar linhas (se você quiser fazer isso, use índices B-Tree), o fato de que o MySQL não pode determinar aproximadamente quantas linhas existem entre dois valores - se os índices de hash estiverem em uso, o otimizador também não poderá usar um índice de hash para acelerar as operações ORDER BY. Tenha em mente que os índices de hash não são a única coisa que o mecanismo MEMORY suporta - os mecanismos MEMORY também podem ter índices B-Tree.

Indexar cardinalidade no MySQL

No que diz respeito aos índices do MySQL, você também pode ouvir outro termo por aí - este termo é chamado de cardinalidade de índice. Em termos muito simples, a cardinalidade do índice refere-se à exclusividade dos valores armazenados em uma coluna que usa um índice. Para visualizar a cardinalidade do índice de um índice específico, você pode simplesmente ir até a aba Estrutura do phpMyAdmin e observar as informações ali contidas ou também pode executar uma consulta 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)

A saída da consulta SHOW INDEXES que pode ser vista acima, como você pode ver, tem muitos campos, um dos quais descreve a cardinalidade do índice:este campo retorna um número estimado de valores únicos no índice - o quanto maior a cardinalidade, maior a chance de o otimizador de consulta usar o índice para pesquisas. Com isso dito, a cardinalidade do índice também tem um irmão - seu nome é seletividade do índice.

Seletividade de índice no MySQL

Uma seletividade de índice é o número de valores distintos em relação ao número de registros na tabela. Em termos simples, a seletividade do índice define o quanto um índice de banco de dados ajuda o MySQL a restringir a busca por valores. Uma seletividade de índice ideal é o valor de 1. Uma seletividade de índice é calculada dividindo os valores distintos em uma tabela pelo número total de registros, por exemplo, se você tiver 1.000.000 de registros em sua tabela, mas apenas 100.000 deles são valores distintos , sua seletividade de índice seria 0,1. Se você tiver 10.000 registros em sua tabela e 8.500 deles forem valores distintos, sua seletividade de índice seria 0,85. Isso é muito melhor. Você entendeu. Quanto maior a seletividade do seu índice, melhor.

Cobertura de índices no MySQL

Um índice de cobertura é um tipo especial de índice no InnoDB. Quando um índice de cobertura está em uso, todos os campos obrigatórios para uma consulta são incluídos, ou “cobertos”, pelo índice, o que significa que você também pode colher os benefícios de ler apenas o índice em vez dos dados. Se nada mais ajudar, um índice de cobertura pode ser o seu ingresso para melhorar o desempenho. Alguns dos benefícios de usar índices de cobertura incluem:

  • Um dos principais cenários em que um índice de cobertura pode ser útil inclui servir consultas sem leituras de E/S adicionais em mesas grandes.

  • O MySQL também pode acessar menos dados devido ao fato de que as entradas de índice são menores que o tamanho das linhas.

  • A maioria dos mecanismos de armazenamento armazena índices melhor do que dados.

Criar índices de cobertura em uma tabela é bastante simples - basta cobrir os campos acessados ​​pelas cláusulas SELECT, WHERE e GROUP BY:

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

Tenha em mente que ao lidar com índices de cobertura, é muito importante escolher a ordem correta das colunas no índice. Para que seus índices de cobertura sejam eficazes, coloque as colunas que você usa com as cláusulas WHERE primeiro, ORDER BY e GROUP BY em seguida e as colunas usadas com a cláusula SELECT por último.

Estratégias de indexação no MySQL

Seguir os conselhos abordados nestas três partes das postagens do blog sobre índices no MySQL pode fornecer uma base muito boa, mas também há algumas estratégias de indexação que você pode usar se quiser realmente aproveite o poder dos índices em sua arquitetura MySQL. Para que seus índices sigam as práticas recomendadas do MySQL, considere:

  1. Isolando a coluna na qual você usa o índice - em geral, o MySQL não usa índices se as colunas são usados ​​em não são isolados. Por exemplo, essa consulta não usaria um índice porque não é isolado:

    SELECT demo_column FROM demo_table WHERE demo_id + 1 = 10;


    No entanto, essa consulta:

    SELECT demo_column FROM demo_table WHERE demo_id = 10;


  2. Não use índices nas colunas que você indexa. Por exemplo, usar uma consulta como essa não faria muito bem, então é melhor evitar essas consultas se você puder:

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


  3. Se você usar consultas LIKE junto com colunas indexadas, evite colocar o curinga no início da consulta de pesquisa porque dessa forma o MySQL também não usará um índice. Isso é em vez de escrever consultas como esta:

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


    Considere escrevê-los assim:

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


    A segunda consulta é melhor porque o MySQL sabe com o que a coluna começa e pode usar índices de forma mais eficaz. Como em tudo, porém, a instrução EXPLAIN pode ser de grande ajuda se você quiser ter certeza de que seus índices são realmente usados ​​pelo MySQL.

Usando o ClusterControl para manter o desempenho de suas consultas

Se você deseja melhorar o desempenho do MySQL, o conselho acima deve colocá-lo no caminho certo. Se você acha que precisa de algo mais, considere o ClusterControl for MySQL. Uma das coisas em que o ClusterControl pode ajudá-lo inclui o gerenciamento de desempenho - como já observado em postagens anteriores do blog, o ClusterControl também pode ajudá-lo a manter suas consultas com o melhor desempenho possível o tempo todo - isso porque o ClusterControl também inclui uma consulta monitor que permite monitorar o desempenho de suas consultas, ver consultas lentas e de longa duração e também consultar discrepâncias alertando sobre possíveis gargalos no desempenho do banco de dados antes que você possa notá-los:

Você pode até filtrar suas consultas permitindo que você faça uma suposição se um índice foi usado por uma consulta individual ou não:


O ClusterControl pode ser uma ótima ferramenta para melhorar o desempenho do seu banco de dados enquanto tira o incômodo da manutenção de suas mãos. Para saber mais sobre o que o ClusterControl pode fazer para melhorar o desempenho de suas instâncias MySQL, dê uma olhada na página ClusterControl for MySQL.

Resumo


Como você provavelmente já deve ter percebido, os índices no MySQL são uma fera muito complexa. Para escolher o melhor índice para sua instância MySQL, saber o que são índices e o que eles fazem, conhecer os tipos de índices MySQL, conhecer seus benefícios e desvantagens, educar-se sobre como os índices MySQL interagem com os mecanismos de armazenamento, também dê uma olhada no ClusterControl for MySQL se você achar que automatizar certas tarefas relacionadas a índices no MySQL pode facilitar seu dia.