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
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)
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.
Usted está haciendo lo que probablemente son suposiciones incorrectas sobre por qué está almacenando las URL. Probablemente/no/seguro cortar www, etc. –
¿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? –
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. –
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, personalmente iría con # 1 (colocando la restricción única en el hash de la url, no en la url sí mismo). – nathan
¿Debería hacer otra columna para el hash, en lugar de configurar la columna VARCHAR URL como principal? – User
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
- 1. La forma más eficiente de almacenar direcciones IP en MySQL
- 2. Manera eficiente de almacenar pares desordenados en una tabla mysql
- 3. MySQL: ¿tipo de datos más eficiente para almacenar notas largas?
- 4. Manera eficiente de almacenar imágenes en android
- 5. La manera más eficiente de almacenar geolocalizaciones en una base de datos
- 6. Java: almacenar de manera eficiente boolean [32]?
- 7. ¿Cómo selecciono un registro aleatorio de manera eficiente en MySQL?
- 8. ¿La manera más eficiente de crear miniaturas?
- 9. ¿Cuál es la forma más eficiente de almacenar una matriz de enteros en una columna MySQL?
- 10. La forma más eficiente de almacenar y acceder a una gran matriz de datos en MySQL
- 11. Manera eficiente de almacenar tuplas en el almacén de datos
- 12. ¿La manera más eficiente de nombrar un avatar de usuario?
- 13. La manera más eficiente de hacer un registro de actividad
- 14. ¿La manera más eficiente de obtener varios hashes en Redis?
- 15. Manera más eficiente de monitorear una cola
- 16. manera más eficiente de extraer una cadena
- 17. Android cargando imágenes al servidor de la manera más eficiente
- 18. Scripting HTTP de manera más eficiente
- 19. ¿Cómo verificar la matriz idéntica de la manera más eficiente?
- 20. ¿La manera más eficiente de dibujar objetos idénticos múltiples?
- 21. La manera más eficiente de invertir una matriz numpy
- 22. ¿La manera más eficiente de indexar una matriz devuelta?
- 23. ¿La manera más eficiente de contar las ocurrencias?
- 24. La mejor manera de almacenar horas de trabajo y consultarlo de manera eficiente
- 25. La manera más eficiente de convertir BCD a binario
- 26. manera más eficiente para extraer componentes de la dirección
- 27. mejor manera de almacenar vistas/Estadísticas en MySQL
- 28. MySQL: ¿la mejor manera de almacenar direcciones MAC?
- 29. Cómo almacenar datos de manera segura en MySQL usando AES_ENCRYPT
- 30. mejor manera de almacenar los "favoritos" del usuario en MySQL
Algunas cadenas de consulta pueden ser largas: http: //www.foo.com/index.jsp? A = 1 & b = 2 & c = 3 ..................... .......................... & z = uuuuggggghhhh –
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. –
Las URL pueden ser muy largas - http://www.boutell.com/newfaq/misc/urllength.html – cjroth