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