Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL:colunas de baixa cardinalidade/seletividade =como indexar?


O índice que você descreve é ​​praticamente inútil. Um índice é melhor usado quando você precisa selecionar um pequeno número de linhas em comparação com o total de linhas.

A razão para isso está relacionada a como um banco de dados acessa uma tabela. As tabelas podem ser avaliadas por uma varredura completa da tabela, onde cada bloco é lido e processado por sua vez. Ou por uma pesquisa de rowid ou chave, onde o banco de dados possui uma chave/rowid e lê a linha exata necessária.

No caso de você usar uma cláusula where baseada na chave primária ou em outro índice exclusivo, por exemplo. where id = 1 , o banco de dados pode usar o índice para obter uma referência exata de onde os dados da linha estão armazenados. Isso é claramente mais eficiente do que fazer uma varredura completa da tabela e processar cada bloco.

Agora, de volta ao seu exemplo, você tem uma cláusula where de where status = 'enabled' , o índice retornará 150 milhões de linhas e o banco de dados terá que ler cada linha por vez usando pequenas leituras separadas. Ao passo que acessar a tabela com uma varredura completa da tabela permite que o banco de dados faça uso de leituras maiores mais eficientes.

Há um ponto em que é melhor apenas fazer uma varredura completa da tabela em vez de usar o índice. Com mysql você pode usar FORCE INDEX (idx_name) como parte de sua consulta para permitir comparações entre cada método de acesso à tabela.

Referência:http://dev .mysql.com/doc/refman/5.5/en/how-to-avoid-table-scan.html