Este conteúdo foi traduzido por máquina para sua conveniência e a Huawei Cloud não pode garantir que o conteúdo foi traduzido com precisão. Para exibir o conteúdo original, use o link no canto superior direito para mudar para a página em inglês.
Atualizado em 2025-05-23 GMT+08:00

Design de índice

  • Use o mesmo tipo de campo para evitar que a conversão implícita cause índices inválidos.
  • Crie índices exclusivos em todos os conjuntos mínimos de campos ou combinações de campos com exclusividade.
    Por exemplo, há uma tabela que contém os campos a, b, c, d, e e f. Se as combinações dos campos ab e ef tiverem exclusividade, é aconselhável criar índices exclusivos para ab e ef, respectivamente.

    Mesmo que o controle de verificação completo seja implementado na camada de aplicação, dados sujos são gerados, desde que não haja um índice exclusivo de acordo com a Lei de Murphy.

    Antes de criar um índice exclusivo, considere se ele é útil para consultas. Índices inúteis podem ser excluídos.

    Avalie o impacto de índices extras nas operações INSERT. Determine se deseja criar índices exclusivos com base nos requisitos de correção e desempenho de dados com exclusividade.

  • Crie índices em campos de tamanho fixo (por exemplo, INT). Ao criar um índice em um campo VARCHAR, o comprimento do índice deve ser especificado. Não é necessário criar um índice em todo o campo. O comprimento do índice é determinado de acordo com a distinção real do texto.

    O comprimento do índice e a distinção são um par de contradições. Geralmente, para dados do tipo string, a distinção de um índice com comprimento de 20 bytes será maior que 90%. A fórmula de distinção é COUNT(DISTINCT LEFT(Column_name, Index_length))/COUNT(*). Coloque os nomes das colunas com uma grande distinção à esquerda.

  • Se possível, não use a pesquisa difusa à esquerda (por exemplo, SELECT * FROM users WHERE u_name LIKE ' %hk') ou pesquisa difusa completa na página para evitar a degradação da verificação de índice para a verificação completa da tabela. Resolva o problema na camada de aplicação.

    Um arquivo de índice tem o recurso de correspondência de prefixo mais à esquerda da árvore B. Se o valor à esquerda não for determinado, o índice não poderá ser usado.

  • Use um índice de cobertura para consultar dados e evitar voltar à tabela. No entanto, não adicione muitos campos ao índice de cobertura, ou o desempenho de gravação será comprometido.

    Os tipos de índices que podem ser criados incluem índices de chave primária, índices exclusivos e índices normais. Um índice de cobertura indica que, se você executar instruções EXPLAIN, "using index" será exibido na coluna Extra.

  • Otimize o desempenho do SQL da seguinte forma: range (requisito mínimo), ref (requisito básico) e consts (requisito máximo).
  • Ao criar um índice composto, coloque a coluna com a maior distinção à esquerda.
  • Certifique-se de que o número de índices em uma única tabela seja no máximo 5 ou não exceda 20% do número de campos de tabela.
  • Evite os seguintes mal-entendidos ao criar índices:
    • Os índices devem ser usados com frequência. Um índice precisa ser criado para uma consulta.
    • Os índices devem ser o menor número possível. Os índices consomem espaço e tornam as atualizações e inserções mais lentas.
    • Índices exclusivos não podem ser usados. Recursos exclusivos devem ser resolvidos na camada de aplicação usando o método "query first and then insert".
  • Reduza o uso de ORDER BY que não pode ser usado com índices com base nos requisitos reais de serviço. As instruções como ORDER BY, GROUP BY e DISTINCT consomem muitos recursos da CPU.
  • Se uma instrução SQL complexa estiver envolvida, use o design de índice existente e adicione EXPLAIN antes da instrução SQL. EXPLAIN pode ajudá-lo a otimizar o índice adicionando algumas restrições de consulta.
  • Execute novas instruções SELECT, UPDATE ou DELETE com EXPLAIN para verificar o uso do índice e garantir que nenhum Using filesort e Using temporary sejam exibidos na coluna Extra. Se o número de linhas verificadas exceder 1.000, tenha cuidado ao executar essas instruções. Analise logs de consulta lenta e exclua declarações de consulta lenta não usadas todos os dias.
    EXPLAIN:
    • type: ALL, index, range, ref, eq_ref, const, system, NULL (O desempenho é classificado de ruim a bom da esquerda para a direita.)
    • possible_keys: indica os índices dos quais o MySQL pode escolher encontrar linhas nesta tabela. Se houver um índice em um campo, o índice será listado, mas não poderá ser usado pela consulta.
    • key: indica a chave (índice) que o MySQL realmente decidiu usar. Se a chave for NULL, o MySQL não encontrou nenhum índice para usar para executar a consulta com mais eficiência. Para forçar o MySQL a usar ou ignorar um índice listado na coluna possible_keys, use FORCE INDEX, USE INDEX ou IGNORE INDEX na sua consulta.
    • ref: mostra quais colunas ou constantes são comparadas com o índice nomeado na coluna-chave para selecionar linhas da tabela.
    • rows: indica o número estimado de linhas a serem lidas para os registros necessários com base em estatísticas de tabela e seleção de índice.
    • Extra:
      • Using temporary: para resolver a consulta, o MySQL precisa criar uma tabela temporária para manter o resultado. Isso geralmente acontece se a consulta contiver cláusulas GROUP BY e ORDER BY que listam colunas de maneira diferente.
      • Using filesort: o MySQL deve fazer uma passagem extra para descobrir como recuperar as linhas em ordem classificada.
      • Using index: as informações da coluna são recuperadas da tabela usando apenas informações da árvore de índice sem precisar fazer uma busca adicional para ler a linha real. Se Using where for exibido ao mesmo tempo, isso indica que as informações desejadas precisam ser obtidas usando a árvore de índice e lendo as linhas da tabela.
      • Using where: na cláusula WHERE, Using where é exibido quando os dados desejados são obtidos sem a leitura de todos os dados da tabela ou quando os dados desejados não podem ser obtidos usando apenas índices. A menos que você pretenda especificamente buscar ou examinar todas as linhas da tabela, talvez haja algo errado na sua consulta se o valor de Extra não for Using where e o tipo de vinculação de tabela for ALL ou index.
  • Se uma função for usada em uma instrução WHERE, o índice se tornará inválido.

    Por exemplo, em WHERE left(name, 5) = 'zhang', a função left invalida o índice no name.

    Você pode modificar a condição no lado do serviço e excluir a função. Quando o conjunto de resultados retornado é pequeno, o lado do serviço filtra as linhas que atendem à condição.

  • Para tabelas ultragrandes, você também precisa obedecer às seguintes regras ao usar índices:
    • Crie índices para colunas envolvidas nas instruções WHERE e ORDER BY. Você pode usar EXPLAIN para verificar se são usados índices ou varreduras de tabelas completas.
    • Campos com distribuição de valor esparsa, como gender com apenas dois ou três valores, não podem ser indexados.
    • Não use campos de string como chaves primárias.
    • Não use chaves estrangeiras. Os programas podem impor as restrições.
    • Ao usar índices de várias colunas, organize-os na mesma ordem das condições de consulta e remova índices desnecessários de coluna única (se houver).
    • Antes de remover um índice, faça uma análise completa e faça backup dos dados.