sql >> Base de Datos >  >> RDS >> Mysql

Rendimiento de SQL buscando cadenas largas

Su idea de codificar cadenas largas para crear un token sobre el cual buscar dentro de una tienda (caché o base de datos) es buena. He visto que esto se hace para cadenas extremadamente grandes y en entornos de gran volumen, y funciona muy bien.

"¿Qué hash usarías para esta aplicación?"

  • No creo que el algoritmo de cifrado (hashing) realmente importe, ya que no está codificando para cifrar datos, está codificando para crear un token sobre el cual usar como clave para buscar valores más largos. Por lo tanto, la elección del algoritmo hash debe basarse en la velocidad.

"¿Calcularías el hash en el código o dejarías que la base de datos lo manejara?"

  • Si fuera mi proyecto, haría el hash en la capa de la aplicación y luego lo pasaría para buscar dentro de la tienda (caché, luego base de datos).

"¿Existe un enfoque radicalmente diferente para almacenar/buscar cadenas largas en una base de datos?"

  • Como mencioné, creo que para su propósito específico, la solución propuesta es buena.

Recomendaciones de tablas (solo demostrativas):

user

  • id int(11) sin firmar, no nulo
  • name_first varchar(100) no nulo

user_agent_history

  • user_id int(11) sin signo no nulo
  • agent_hash varchar(255) no nulo

agent

  • agent_hash varchar(255) no nulo
  • browser varchar(100) no nulo
  • agent texto no nulo

Algunas notas sobre el esquema:

  • Desde su OP, parece que necesita una relación M:M entre el usuario y el agente, debido al hecho de que un usuario puede estar usando Firefox desde el trabajo, pero luego puede cambiar a IE9 en casa. De ahí la necesidad de la tabla dinámica.

  • El varchar(255) utilizado para agent_hash está en debate. MySQL sugerencias usando un tipo de columna varbinary para almacenar hashes, de los cuales hay varios tipos.

  • También sugeriría hacer agent_hash una clave principal, o al menos, agregando una restricción ÚNICA a la columna.