2009-06-17 18 views
13

Quiero almacenar un gran conjunto de URL en MySql y crear un índice único en la columna. Si hago la columna utf8, entonces estaré limitado a varchar (333), que no es suficiente para contener algunas de mis URL. Si declaro que la columna es latin1, obtengo los 1000 caracteres completos (no creo que necesite tanto). Sin embargo, tendré que codificar la URL y ser coherente sobre trabajar siempre con la URL codificada. ¿Hay una mejor manera de administrar grandes conjuntos de URL?¿La manera más eficiente de almacenar URLs en Mysql?

Respuesta

5

Una cosa que puede pensar es almacenar el nombre de host y la porción de protocolo de la URL en una tabla separada y hacer referencia a ella a través de una clave. Esto también podría resultar útil más tarde para obtener todas las URL de un host específico y para ayudar con las preocupaciones sobre la longitud de la cadena.

Por ejemplo:

PROTOCOLS 
----------------------- 
PROTOCOL_ID INTEGER 
PROTOCOL  VARCHAR(10) (i.e., http, https, ftp, etc.) 

HOSTS 
----------------------- 
id  BIGINT 
hostname varchar(256) 

URL 
----------------------- 
PROTOCOL  INTEGER FK to PROTOCOLS 
HOSTNAME  BIGINT FK to HOSTS 
QUERY_STRING VARCHAR(333) 
+0

Algunas cadenas de consulta pueden ser largas: http: //www.foo.com/index.jsp? A = 1 & b = 2 & c = 3 ..................... .......................... & z = uuuuggggghhhh –

+0

De acuerdo. Es posible que desee seguir la ruta de la sugerencia de Longneck de utilizar un campo de texto. Me acerqué más a "¿Existe una forma mejor de administrar grandes conjuntos de URL?", Con el efecto secundario de que también ayude a la longitud de sus URL.Una cosa que también puede querer hacer depende de cómo use las URL para dividir el nombre de host en host y dominio con la tabla HOSTS que tiene una domain_key en una tabla DOMAIN. Esto podría hacer que encontrar todas las URL dentro de un dominio sea trivial. –

+0

Las URL pueden ser muy largas - http://www.boutell.com/newfaq/misc/urllength.html – cjroth

0

La práctica más común que conozco es el uso de un algoritmo hash con control de colisiones, solo use algún tipo de codificación rápida en una dirección que producirá colisiones muy bajas en las URL.

Intenta cortar partes que sabes que serán las mismas en todas las direcciones URL (es decir, HTTP: //, www, etc.) SI las URL son todas parte de tu dominio, córtalas también.

De lo contrario, volvería a pensar el problema y trataré de encontrar una forma diferente de lograr lo que sea que esté tratando de lograr. Supongo que tener un conjunto único de URL realmente está resolviendo algún otro problema.

+2

Usted está haciendo lo que probablemente son suposiciones incorrectas sobre por qué está almacenando las URL. Probablemente/no/seguro cortar www, etc. –

+0

¿Podría ubicar un ejemplo? Al eliminar http y www puede volver a producir fácilmente la URL original, no afecta la integridad de las definiciones ... ¿Podría explicar esto? –

+5

Eso está mal. No hay garantía de que http://www.foo.com y http://foo.com se refieran a la misma URL. Por no hablar de https://www.foo.com y http://foo.com. –

9

tres buenas maneras de hacer esto:

1) utilizar texto en lugar de VARCHAR. para garantizar la exclusividad, también deberá crear una columna VARCHAR separada para almacenar un hash MD5() o SHA1() y agregar un índice ÚNICO o PRIMARIO. esto tiene la desafortunada consecuencia de que un disco adicional busca recuperar la URL, pero depende de su caso de uso que pueda estar bien.

2) utilice VARCHAR con una intercalación binaria y comprima la URL con COMPRESS().

3) Olvidé la tercera porque estaba escribiendo las dos primeras. grr ...

+1

+1, personalmente iría con # 1 (colocando la restricción única en el hash de la url, no en la url sí mismo). – nathan

+0

¿Debería hacer otra columna para el hash, en lugar de configurar la columna VARCHAR URL como principal? – User

+0

Hice dos sugerencias por separado. No dije que uno fuera mejor que el otro. Debe elegir cuál es el más apropiado para su caso de uso. – longneck

Cuestiones relacionadas