Como faço para efetivamente encontrar linhas blob duplicados no MySQL?
-
11-07-2019 - |
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.