Pergunta

Eu tenho uma tabela do formulário

CREATE TABLE data
{
   pk INT PRIMARY KEY AUTO_INCREMENT,
   dt BLOB
};

Tem cerca de 160.000 linhas e cerca de 2 GB de dados na coluna blob (avg. 14kb per blob). Outra tabela tem chaves estrangeiras para esta tabela.

Algo como 3000 das bolhas são idênticos. Então, o que eu quero é uma consulta que vai me dar uma mesa mapa re que vai permitir-me para remover as duplicatas.

A abordagem ingênua levou cerca de uma hora em 30-40k linhas:

SELECT a.pk, MIN(b.pk) 
    FROM data AS a 
    JOIN data AS b
  ON a.dt=b.dt
  WHERE b.pk < a.pk
  GROUP BY a.pk;

Acontece que eu tenho, por outras razões, uma tabela que tem os tamanhos das bolhas:

CREATE TABLE sizes
(
   fk INT,  // note: non-unique
   sz INT
   // other cols
);

Ao construir índices para ambos fk e outro para sz a consulta direta que leva cerca de 24 segundos com 50 mil linhas:

SELECT da.pk,MIN(db.pk) 
  FROM data AS da
  JOIN data AS db
  JOIN sizes AS sa
  JOIN sizes AS sb
  ON
        sa.size=sb.size
    AND da.pk=sa.fk
    AND db.pk=sb.fk
  WHERE
        sb.fk<sa.fk
    AND da.dt=db.dt 
  GROUP BY da.pk;

No entanto, que está fazendo uma varredura completa da tabela on da (tabela de dados). Dado que a taxa de acerto deve ser bastante baixo Eu acho que uma varredura de índice seria melhor. Com isso em mente na acrescentou uma terceira cópia dos dados como um 5º se unem para conseguir isso, e perdeu cerca de 3 seg.

OK então para a pergunta:? Am I vai ficar muito melhor do que a segunda escolha Se sim, como

Um pouco de um corolário é: se eu tiver uma tabela onde os da chave coluna começar a usar muito pesado, mas o resto só deve começar raramente usada, eu nunca vai ser melhor para a adição de outro juntar-se de que a tabela para incentivar uma varredura de índice vs . uma varredura completa da tabela?


Xgc em pontos #mysql@irc.freenode.net que a adição de uma tabela utilitário como tamanhos, mas com uma restrição exclusiva em fk pode ajudar muito. Algum divertimento com gatilhos eo que não pode torná-lo ainda não ruim para manter-se atualizado.

Foi útil?

Solução

Você sempre pode usar uma função hash ( MD5 ou SHA1 ) para seus dados e então comparar os hashes.

A questão é se você pode salvar os hashes em seu banco de dados?

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