Pergunta

Eu criei um novo índice em uma tabela, com 35 milhões de registros e de sua execução por cerca de 1 dia agora.Anteriormente, quando eu criei índices demorou 20 minutos, colunas foram, contudo, carros alegóricos.O novo idnex é um varchar(45)

Eu usei o comando processlist o que mostra o índice de criação ainda está em andamento, com a seguinte saída

65417 | Repair with keycache | CREATE INDEX insert_index on checkins(dateinserted)

Eu queria saber se alguém poderia me dar conselhos sobre como encontrar se a consulta está realmente morto e está apenas sentado na lista de processos.Talvez alguma coisa deu errado em algum momento e eu não estou ciente.

Obrigado

Foi útil?

Solução

O índice é construção, mas muito lentamente.

O MySQL tem dois métodos disponíveis para a construção de índices:

  1. pela classificação.Este é o método mais rápido, mas usa muita memória.
  2. por keycache.Lenta, lenta, lenta - mas usa pouca memória.

O keycache método é um pouco como a inserção de classificação:os valores são inseridos no índice, um de cada vez.Este é o mesmo método usado pelo servidor quando a instrução INSERT é usada para adicionar linhas a uma tabela.

O método de classificação classifica todos os valores usando o quicksort, e, em seguida, cria o índice de que.Ele é muito rápido, mas requer uma grande quantidade de memória e espaço em disco temporário.

Algumas variáveis de servidor pode aumentar o espaço disponível para o método de classificação, e assim permitir que ele funcione com maior tabelas.Ver myisam_max_sort_file_size

http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_myisam_max_sort_file_size

No Linux, você pode acompanhar o andamento do índice de reparação por verificar o tamanho dos arquivos temporários que são usados para construir o índice.O comando a seguir irá listar todos os arquivos mantidos em aberto pelo MySQL processo:

sudo ls -l /proc/[mysql-pid]/fd  

Então confira o tamanho de uns com os hashes em seu nome - estes são os arquivos temporários.

Outras dicas

Lembre -se de que o tamanho do índice será de 35m*45, pelo menos. Se for uma coluna UTF8, será 35m*45*3. São mais de 4 shows! Se você não tiver toneladas de RAM para apoiar, ele terá que fazer muito acesso ao disco e realmente matar o desempenho.

Você pode normalizar esta coluna em outra tabela?

Caso contrário, os valores tendem a variar o suficiente, digamos os 8 primeiros caracteres? Você pode se safar apenas com a indexação dos 8 primeiros.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top