Bueno, he encontrado otra forma de encontrar los registros duplicados de una manera muchísimo mas Eficiente. La anterior era totalmente ineficiente con bases de datos grande.
Al principio sirvió Fantástico pero he llegado al punto que se vuelve eterno esperar la respuesta del servidor MySQL ya que la información a crecido muy rápidamente, ahora estoy hablando de ~45K aproximadamente.
Generaré 50K registros con el siguiente codigo en C:
#include<stdio.h>
int main() {
srandomdev();
unsigned short i=0;
unsigned char a,b;
while(i < 50000) {
a = (unsigned char) random();
b = (unsigned char) random();
i++;
}
return 0;
}
Despues de compilarlo y ejecutarlo
Anon@localhost % gcc csvCrandom.c -o csvCrandom
Anon@localhost % ./csvCrandom
Nos devuelve una salida muy extensa asi:
79,183
213,188
177,147
31,158
90,157
230,190
40,222
176,219
37,14
237,130
116,104
66,145
...
Asi unas 50K veces, lo comprobamos con:
Anon@localhost % ./csvCrandom | wc -l
50000
Despues de Mandar la salida al archivo:
Anon@localhost % ./csvCrandom > ./csvRandom.csv
Anon@localhost % wc -l csvRandom.csv
50000 csvRandom.csv
Vemos que tiene nuestras 50K Lineas entonces desde MySQL empezamos desde 0 con el codigo que mistre anteriormente Modificado:
DROP DATABASE IF EXISTS `db`;
CREATE DATABASE `db`;
USE db;
DROP TABLE IF EXISTS `tabla`;
CREATE TABLE tabla (
id VARCHAR(10) NULL,
grupo VARCHAR(10) NULL
);
LOAD DATA INFILE '/path/to/file/csvRandom.csv' INTO TABLE tabla FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
Una vez cargada la información comprobábamos en MySQL que se carge correctamente con count
mysql> Select count(*) from tabla;
+----------+
| count(*) |
+----------+
| 50000 |
+----------+
1 row in set (0.00 sec)
Vemos que todo esta bien, ahora si llamamos al primer escript para comparar vemos que
podría tardar horas y muchos se desesperarían.
Primer script:
SELECT * FROM tabla
WHERE(id, grupo)
IN(
SELECT id, grupo FROM tabla
GROUP BY id, grupo
HAVING COUNT(*)>1);
Ahora si lo reducimos a una línea y sin subconsulta queda asi:
Segundo script
SELECT *,COUNT(*) AS 'Veces Repetido' FROM tabla GROUP BY concat(id,grupo) HAVING COUNT(*)>1;
Vemos que
no dura mas de 2 Segundos en ejecutarse Y encuentra la misma cantidad registros duplicados.
Tal vez ya lo hubiesen pensado, sin embargo como no lo encontré publicado en el foro, lo pongo. Espero y le sirva a alguien mas.
Saludos.