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

Entendendo Índices no MySQL:Parte Um

Os índices no MySQL são uma fera muito complexa. Cobrimos os índices MySQL no passado, mas nunca nos aprofundamos neles - faremos isso nesta série de postagens do blog. Esta postagem do blog deve funcionar como um guia muito geral para índices, enquanto as outras partes desta série se aprofundarão um pouco mais nesses assuntos.

O que são índices?

Em geral, como já observado em um post anterior do blog sobre índices, um índice é uma lista alfabética de registros com referências às páginas em que são mencionados. No MySQL, um índice é uma estrutura de dados que é mais comumente usada para localizar linhas rapidamente. Você também pode ouvir o termo “chaves” - também se refere a índices.

O que os índices fazem?

No MySQL os índices são usados ​​para localizar rapidamente linhas com valores de coluna específicos e para evitar a leitura de toda a tabela para encontrar quaisquer linhas relevantes para a consulta. Os índices são usados ​​principalmente quando os dados armazenados em um sistema de banco de dados (por exemplo, MySQL) ficam maiores porque quanto maior a tabela, maior a probabilidade de você se beneficiar dos índices.

Tipos de índice MySQL

No que diz respeito ao MySQL, você já deve ter ouvido falar que ele possui vários tipos de índices:

  • Um B-Tree INDEX - esse índice é frequentemente usado para acelerar consultas SELECT que correspondem a uma cláusula WHERE. Esse índice pode ser usado em campos onde os valores não precisam ser exclusivos, ele também aceita valores NULL.

  • UM ÍNDICE DE TEXTO COMPLETO - esse índice é usado para usar recursos de pesquisa de texto completo. Esse tipo de índice encontra palavras-chave no texto em vez de comparar diretamente os valores com os valores no índice.

  • Um UNIQUE INDEX é frequentemente usado para remover valores duplicados de uma tabela. Impõe a exclusividade dos valores de linha.

  • Uma PRIMARY KEY também é um índice - é frequentemente usada em conjunto com campos com um atributo AUTO_INCREMENT. Este tipo de índice não aceita valores NULL e, uma vez definido, os valores da coluna que possui PRIMARY KEY não podem ser alterados.

  • Um ÍNDICE DESCENDENTE é um índice que armazena linhas em ordem decrescente. Este tipo de índice foi introduzido no MySQL 8.0 - o MySQL usará este tipo de índice quando uma ordem decrescente for solicitada pela consulta.

Escolhendo tipos de dados ideais para índices no MySQL

No que diz respeito aos índices, há também a necessidade de ter em mente que o MySQL suporta uma ampla variedade de tipos de dados e alguns tipos de dados não podem ser usados ​​junto com certos tipos de índices (por exemplo, FULLTEXT os índices só podem ser usados ​​em colunas baseadas em texto (CHAR, VARCHAR ou TEXT) - eles não podem ser usados ​​em nenhum outro tipo de dados), portanto, antes de escolher os índices para o design do seu banco de dados, decida o tipo de dados que você usará a coluna em questão (decida que tipo de classe de dados você vai armazenar:você vai armazenar números? Valores de string? Tanto números quanto valores de string? etc.), então decida sobre o intervalo dos valores que você vai armazenar (escolha aquele que você acha que não excederá porque aumentar o intervalo de tipos de dados pode ser uma tarefa demorada mais tarde - recomendamos que você opte por usar um tipo de dados simples), e se você não pretende usar NULL valores em suas colunas, especifique seus campos como NOT NULL sempre que puder - quando um co anulável lumn é indexado, requer um byte extra por entrada.

Escolhendo conjuntos de caracteres e agrupamentos ideais para índices no MySQL

Além dos tipos de dados, lembre-se de que cada caractere no MySQL ocupa espaço. Por exemplo, os caracteres UTF-8 podem levar entre 1 e 4 bytes cada, portanto, convém evitar indexar, por exemplo, 255 caracteres e usar apenas, digamos, 50 ou 100 caracteres para uma determinada coluna.

Os benefícios e desvantagens do uso de índices no MySQL

O principal benefício de usar índices no MySQL é o aumento do desempenho das consultas de pesquisa que correspondem a uma cláusula WHERE - os índices aceleram as consultas SELECT que correspondem a uma cláusula WHERE porque o MySQL não lê a tabela inteira para encontrar linhas relevantes para a consulta. No entanto, tenha em mente que os índices têm suas próprias desvantagens. Os principais são os seguintes:

  • Os índices consomem espaço em disco.

  • Os índices degradam o desempenho das consultas INSERT, UPDATE e DELETE - quando os dados são atualizados, o índice precisa ser atualizado junto com ele.

  • O MySQL não protege você de usar vários tipos de índices ao mesmo tempo. Em outras palavras, você pode usar uma PRIMARY KEY, um INDEX e um UNIQUE INDEX na mesma coluna - o MySQL não protege você de cometer tal erro.

Se você suspeitar que algumas de suas consultas estão se tornando mais lentas, considere dar uma olhada na guia Monitor de Consultas do ClusterControl - ativando o monitor de consultas, você pode ver quando uma determinada consulta foi vista pela última vez e seu máximo e tempo médio de execução que podem ajudar você a escolher os melhores índices para sua tabela.

Como escolher o melhor índice a ser usado?

Para escolher o melhor índice a ser usado, você pode usar os mecanismos internos do MySQL. Por exemplo, você pode usar o explicador de consultas - a consulta EXPLAIN. Ele explicará qual tabela é usada, se possui partições ou não, quais índices são possíveis de usar e qual chave (índice) é usada. Ele também retornará o comprimento do índice e a quantidade de linhas que sua consulta retorna:

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)

Neste caso, tenha em mente que os índices são frequentemente usados ​​para ajudar o MySQL a recuperar dados de forma eficiente quando os conjuntos de dados são maiores que o normal. Se sua tabela for pequena, talvez você não precise usar índices, mas se perceber que suas tabelas estão ficando cada vez maiores, é provável que você se beneficie de um índice.

A fim de escolher o melhor índice a ser usado para seu cenário específico, lembre-se de que os índices também podem ser uma das principais causas de problemas de desempenho. Tenha em mente que se o MySQL usará efetivamente os índices ou não depende de alguns fatores, incluindo o design de suas consultas, os índices em uso, os tipos de índices em uso, também a carga do banco de dados no momento em que a consulta é executada e outras coisas. Aqui estão algumas coisas a serem consideradas ao usar índices no MySQL:

  • Quantos dados você tem? Talvez alguns deles sejam redundantes?

  • Que consultas você usa? Suas consultas usariam cláusulas LIKE? Que tal encomendar?

  • Que tipo de índice você precisaria usar para melhorar o desempenho de suas consultas?

  • Seus índices seriam grandes ou pequenos? Você precisaria usar um índice em um prefixo da coluna para diminuir seu tamanho?

Vale a pena notar que você provavelmente deve evitar usar vários tipos de índices (por exemplo, um índice B-Tree, um UNIQUE INDEX e uma PRIMARY KEY) na mesma coluna também.

Melhorando o desempenho da consulta com índices

Para melhorar o desempenho de consultas com índices, você precisa dar uma olhada em suas consultas - a instrução EXPLAIN pode ajudar com isso. Em geral, aqui estão algumas coisas que você deve considerar se quiser que seus índices melhorem o desempenho de suas consultas:

  • Peça ao banco de dados apenas o que você precisa. Na maioria dos casos, usar a coluna SELECT será mais rápido do que usar SELECT * (este é o caso sem usar índices também)

  • Um índice de árvore B pode ser adequado se você pesquisar valores exatos (por exemplo, SELECT * FROM demo_table WHERE some_field ='x') ou se você deseja pesquisar valores usando curingas (por exemplo, SELECT * FROM demo_table WHERE some_field LIKE 'demo%' - neste caso, tenha em mente que usar consultas LIKE com qualquer coisa no início pode fazer mais mal do que bem - evite usar consultas LIKE com um sinal de porcentagem na frente do texto que você está procurando - dessa forma o MySQL pode não usar um índice porque não sabe com o que o valor da linha começa) - embora tenha em mente que um índice de árvore B também pode ser usado para comparações de coluna em expressões que usam igual (=), maior que (>), maior ou igual a (>=), menor que (<), menor ou igual a (<=) ou operadores BETWEEN.

  • Um índice FULLTEXT pode ser adequado se você estiver usando texto completo (MATCH ... AGAINST( )) consultas de pesquisa ou se seu banco de dados for projetado de forma que use apenas colunas baseadas em texto - os índices FULLTEXT podem usar colunas TEXT, CHAR ou VARCHAR, eles não podem ser usados ​​em nenhum outro tipo de coluna.

  • Um índice de cobertura pode ser útil se você quiser executar consultas sem leituras de E/S adicionais em tabelas grandes . Para criar um índice de cobertura, cubra as cláusulas WHERE, GROUP BY e SELECT usadas pela consulta.

Analisaremos os tipos de índices nas próximas partes desta série de blogs, mas, em geral, se você usar consultas como SELECT * FROM demo_table WHERE some_field ='x' a B-tree INDEX pode ser um ajuste, se você usar consultas MATCH() AGAINST() você provavelmente deve procurar em um índice FULLTEXT, se sua tabela tiver valores de linha muito longos, você provavelmente deve procurar indexar uma parte da coluna.

Quantos índices você deve ter?

Se você já usou índices para melhorar o desempenho de suas consultas SELECT, provavelmente já se perguntou:quantos índices você realmente deveria ter? Para entender isso, você precisa ter em mente o seguinte:

  1. Os índices são geralmente os mais eficazes com grandes quantidades de dados.

  2. O MySQL usa apenas um índice por cada instrução SELECT em uma consulta (subconsultas são vistas como instruções separadas) - use a consulta EXPLAIN para descobrir quais índices são os mais eficazes para as consultas que você usa.

  3. Os índices devem tornar todas as suas instruções SELECT rápidas o suficiente sem comprometer muito o espaço em disco - “rápido o suficiente” , no entanto, é relativo, então você precisaria experimentar.

Indices e mecanismos de armazenamento

Ao lidar com índices no MySQL, também tenha em mente que pode haver alguns tipos de limitações se você usar vários mecanismos (por exemplo, se você usar MyISAM em oposição ao InnoDB). Entraremos em mais detalhes em um blog separado, mas aqui estão algumas ideias:

  • O número máximo de índices por tabelas MyISAM e InnoDB é 64, o número máximo de colunas por índice em ambos mecanismos de armazenamento é 16.

  • O tamanho máximo da chave para InnoDB é 3500 bytes - o tamanho máximo da chave para MyISAM é 1000 bytes.

  • Os índices de texto completo têm limitações em certos mecanismos de armazenamento - por exemplo, os índices de texto completo do InnoDB têm 36 palavras irrelevantes, MyISAM lista de palavras irrelevantes é um pouco maior com 143 palavras irrelevantes. O InnoDB deriva essas palavras irrelevantes da variável innodb_ft_server_stopword_table enquanto o MyISAM deriva essas palavras irrelevantes do arquivo storage/myisam/ft_static.c - todas as palavras encontradas no arquivo serão tratadas como palavras irrelevantes.

  • MyISAM era o único mecanismo de armazenamento com suporte para opções de pesquisa de texto completo até o MySQL 5.6 (MySQL 5.6. 4 para ser exato) surgiu significando que o InnoDB suporta índices de texto completo desde o MySQL 5.6.4. Quando um índice FULLTEXT está em uso, ele encontra palavras-chave no texto em vez de comparar valores diretamente com os valores no índice.

  • Os índices desempenham um papel muito importante para o InnoDB - o InnoDB bloqueia as linhas quando as acessa, portanto, um número reduzido de acessos ao InnoDB podem reduzir bloqueios.

  • O MySQL permite que você use índices duplicados na mesma coluna.

  • Alguns mecanismos de armazenamento têm certos tipos de índices padrão (por exemplo, para o mecanismo de armazenamento MEMORY o tipo de índice padrão é hash )

Resumo


Nesta parte sobre índices no MySQL, passamos por algumas coisas gerais relacionadas a índices neste sistema de gerenciamento de banco de dados relacional. Nas próximas postagens do blog, veremos alguns cenários mais aprofundados do uso de índices no MySQL, incluindo o uso de índices em determinados mecanismos de armazenamento, etc. - também explicaremos como o ClusterControl pode ser usado para atingir suas metas de desempenho no MySQL.