Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SQL-Leistung bei der Suche nach langen Zeichenfolgen

Ihre Idee, lange Zeichenfolgen zu hashen, um ein Token zu erstellen, nach dem in einem Speicher (Cache oder Datenbank) gesucht werden kann, ist gut. Ich habe gesehen, wie dies für extrem große Zeichenfolgen und in Umgebungen mit hohem Volumen durchgeführt wurde, und es funktioniert hervorragend.

"Welchen Hash würden Sie für diese Anwendung verwenden?"

  • Ich glaube nicht, dass der Verschlüsselungsalgorithmus (Hashing-Algorithmus) wirklich wichtig ist, da Sie nicht hashen, um Daten zu verschlüsseln, Sie hashen, um ein Token zu erstellen, das als Schlüssel zum Nachschlagen längerer Werte verwendet werden kann. Daher sollte die Wahl des Hashing-Algorithmus auf der Geschwindigkeit basieren.

"Würden Sie den Hash im Code berechnen oder die DB damit umgehen lassen?"

  • Wenn es mein Projekt wäre, würde ich das Hashing auf der App-Ebene durchführen und es dann weiterleiten, um im Store nachzuschlagen (Cache, dann Datenbank).

"Gibt es einen radikal anderen Ansatz zum Speichern/Suchen langer Zeichenfolgen in einer Datenbank?"

  • Wie ich bereits erwähnt habe, denke ich, dass Ihre vorgeschlagene Lösung für Ihren speziellen Zweck gut ist.

Tabellenempfehlungen (nur demonstrativ):

user

  • id int(11) unsigned not null
  • name_first varchar(100) nicht null

user_agent_history

  • user_id int(11) unsigned not null
  • agent_hash varchar(255) nicht null

agent

  • agent_hash varchar(255) nicht null
  • browser varchar(100) nicht null
  • agent Text nicht null

Einige Anmerkungen zum Schema:

  • Aus Ihrem OP geht hervor, dass Sie eine M:M-Beziehung zwischen Benutzer und Agent benötigen, da ein Benutzer möglicherweise Firefox von der Arbeit aus verwendet, dann aber zu Hause zu IE9 wechselt. Daher die Notwendigkeit für die Pivot-Tabelle.

  • Der für agent_hash verwendete varchar(255). steht zur Debatte. MySQL schlägt vor Verwenden eines varbinary-Spaltentyps zum Speichern von Hashes, von denen es mehrere Typen gibt.

  • Ich würde auch vorschlagen, entweder agent_hash zu erstellen einen Primärschlüssel oder zumindest das Hinzufügen einer UNIQUE-Einschränkung zur Spalte.