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

Wie effizient ist es aus Performance-Sicht, eine temporäre MySQL-Tabelle für eine stark genutzte Website-Funktion zu verwenden?

Was Sie gesagt haben, ist völlig richtig, die temporäre Tabelle ist nur für den aktuellen Benutzer / die aktuelle Verbindung sichtbar. Dennoch gibt es etwas Overhead und einige andere Probleme wie:

  • Für jede der Tausenden von Suchanfragen werden Sie diese Tabelle erstellen und füllen (und sie später löschen) – nicht pro Benutzer, pro Suche. Weil jede Suche höchstwahrscheinlich das Skript erneut ausführen wird und "pro Sitzung" nicht PHP-Sitzung bedeutet - es bedeutet Datenbanksitzung (offene Verbindung).
  • Sie benötigen den CREATE TEMPORARY TABLES Privileg, das Sie könnten nicht haben.
  • Trotzdem sollte diese Tabelle wirklich den Typ MEMORY haben, was Ihren Arbeitsspeicher mehr stiehlt, als es den Anschein hat. Da MEMORY-Tabellen selbst mit VARCHAR Zeilenspeicherung mit fester Länge verwenden.
  • Wenn Ihre Heuristik später zweimal auf diese Tabelle verweisen muss (wie SELECT xyz FROM patternmatch AS pm1, patternmatch AS pm2 ... ) - das ist bei MEMORY-Tabellen nicht möglich.

Als nächstes wäre es einfacher für Sie - und auch für die Datenbank - das LIKE '%xyz%' hinzuzufügen direkt zu Ihren images Tabellen WHERE Klausel. Es wird dasselbe tun, ohne den Aufwand, eine TEMP TABLE zu erstellen und ihr beizutreten.

In jedem Fall - egal welchen Weg Sie gehen - das WO wird schrecklich langsam sein. Auch wenn Sie images.name einen Index hinzufügen Sie werden höchstwahrscheinlich LIKE '%xyz%' benötigen statt LIKE 'xyz%' , sodass dieser Index nicht verwendet wird.

Nein. :)

Alternative Optionen

MySQL hat eine eingebaute Volltext-Suche (seit 5.6 auch für InnoDB), das Ihnen sogar diese Wertung geben kann:Ich empfehle dringend, es zu lesen und auszuprobieren. Sie können sicher sein, dass die Datenbank besser als Sie weiß, wie diese Suche effizient durchgeführt wird.

Wenn Sie MyISAM anstelle von InnoDB verwenden, beachten Sie die oft übersehene Einschränkung, dass FULLTEXT-Suchen nur etwas zurückgeben, wenn die Anzahl der Ergebnisse weniger als 50 % der gesamten Tabellenzeilen beträgt.

Andere Dinge, die Sie sich vielleicht ansehen möchten, sind zum Beispiel Solr (Eine schöne Einführung zu diesem Thema selbst wäre der Anfang von http://en.wikipedia.org/wiki/Apache_Solr ). Wir verwenden es in unserem Unternehmen und es leistet hervorragende Arbeit, erfordert jedoch einiges an Einarbeitung.

Zusammenfassung

Die Lösung für Ihr aktuelles Problem selbst (die Suche) ist die Verwendung der FULLTEXT-Fähigkeiten.

Um Ihnen eine Zahl zu nennen, 10.000 Aufrufe pro Sekunde sind schon nicht "trivial" - mit Hunderttausenden von Suchen pro Sekunde sind die Art von Leistungsproblemen, auf die Sie stoßen werden, überall in Ihrer Einrichtung. Sie werden ein paar Server, Load Balancing und tonnenweise anderen erstaunlichen technischen Mist brauchen. Und eines davon wird zum Beispiel Solr sein;)