2010-03-09 4 views
3

J'ai deux tables avec la liste des URL récupérées à partir de différentes sources.Quelle est la meilleure et la plus rapide façon de comparer deux URL?

Je veux trouver les entrées communes et les mettre dans une table séparée.

C'est ce que je fais:

  1. trouver md5 d'URL en les chercher.
  2. Stockez-les dans une colonne.
  3. Je récupère une table sous la forme d'un tableau, exécute une boucle à travers celle-ci et insère les valeurs de l'autre table où md5 hash est identique.

EDIT: Devrais-je supprimer les URL de "http: //" et "www"?

Je veux savoir toute autre méthode, ce qui est mieux et plus vite, à l'aide que je peux effectuer ce qui précède

J'utilise PHP + MySQL

+0

Je suis un peu curieux - quelqu'un peut me dire pourquoi vous hash l'URL du tout? Est-ce pour obtenir un type de données plus facile à comparer (à la place des recherches de chaînes)? –

Répondre

3

MD5 est un peu lent si vous avez besoin de vitesse réelle. Essayez MurmurHash

Vous devez effectuer les transformations suivantes avant le calcul de hachage:

  • Strip "http: //" et www.
  • bande slash
  • URL Normaliser (urlencode il)
+0

+1 pour normaliser l'URL. –

+0

BTW, pas sûr que l'implémentation PHP de MurmurHash sera plus rapide que la fonction md5. Cela a besoin de tests. Quoi qu'il en soit pour la vitesse réelle, vous pouvez faire un plugin PHP. –

+0

Je suppose que l'implémentation de MumurHash en PHP sera difficile. Existe-t-il d'autres méthodes de hachage plus rapides? – Jagira

0

Essayez quelque chose comme:.

INSERT INTO table3 (SELECT url FROM table1, table2 WHERE table1.hash = table2.hash) 

Ce n'est pas une instruction SQL valide, mais une requête imbriquée comme celle-ci devrait lire les URL de table1 et table2 qui correspondent à leur table de hachage et les placer dans la table3

EDIT: Si vous souhaitez nettoyer vos URL d'entrée (par ex. supprimer les variables GET), je le ferais avant de les sauvegarder dans tabel1 et table2. Je ne voudrais pas supprimer http et www comme "https://somesite" et "http://somesite" ainsi que "www.somesite.com" et "somesite.com" peuvent avoir un contenu différent.

0
SELECT * FROM table1 WHERE hash IN (SELECT hash FROM table2) 

Vous voudrez probablement également jeter un coup d'œil sur le concept des jointures de table.

Questions connexes