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

CASE-Leistung in MySQL?

So ziemlich alle Funktionen pro Zeile wirken sich auf die Leistung aus. Die einzige wirkliche Frage lautet:"Ist die Auswirkung gering genug, um sich keine Sorgen zu machen?".

Dies ist etwas, das Sie durch Messen und nicht durch Raten herausfinden sollten. Die Datenbankverwaltung ist nur dann eine Set-and-Forget-Aktivität, wenn sich weder Ihre Daten noch Ihre Abfragen jemals ändern. Andernfalls sollten Sie die Leistung regelmäßig überwachen, um sicherzustellen, dass keine Probleme auftreten.

Mit "klein genug" in den obigen Kommentaren meine ich, dass Sie sich wahrscheinlich keine Gedanken über die Auswirkungen auf die Leistung von etwas wie:

machen müssen
select * from friends where lowercase(lastname) = "smith"

wenn du nur drei Freunde hast.

Die Auswirkungen dieser Dinge werden schwerwiegender, wenn die Tabelle größer wird. Wenn Sie beispielsweise 100 Millionen Kunden haben und alle Kunden finden möchten, die wahrscheinlich computerbezogen sind, sollten Sie Folgendes nicht versuchen:

select name from customers where lowercase(name) like '%comp%'

Das wird Ihre DBAs wahrscheinlich wie eine Tonne Ziegelsteine ​​auf Sie stürzen.

Eine Möglichkeit, wie wir dies in der Vergangenheit behoben haben, besteht darin, Redundanz in die Daten einzuführen. Bei diesem ersten Beispiel würden wir eine zusätzliche Spalte namens lowerlastname hinzufügen und füllen Sie es mit dem kleingeschriebenen Wert von lastname . Dann indizieren Sie das für Suchzwecke und select Sie aus Anweisungen werden blitzschnell, wie sie sein sollten.

Und was macht das mit unserem geliebten 3NF, höre ich Sie fragen? Die Antwort ist "nicht viel", wenn man weiß, was man tut :-)

Sie können die Datenbank so einrichten, dass diese neue Spalte durch einen Einfüge-/Aktualisierungstrigger gefüllt wird, um die Datenkonsistenz zu wahren. Es ist vollkommen akzeptabel, 3NF aus Leistungsgründen zu brechen, vorausgesetzt, Sie verstehen und mildern die Konsequenzen.

In ähnlicher Weise könnte diese zweite Abfrage einen Insert/Update-Trigger haben, der eine neue indizierte Spalte name_contains_comp füllt immer wenn ein Eintrag aktualisiert oder eingefügt wurde, der den entsprechenden Text enthielt.

Da die meisten Datenbanken viel öfter gelesen als geschrieben werden, verschiebt dies die Kosten der Berechnung auf das Einfügen/Aktualisieren, was sich effektiv über alle ausgewählten Operationen hinweg amortisiert. Die Abfrage wäre dann:

select name from customers where name_contains_comp = 'Y'

Auch hier finden Sie die Abfrage blendend schnell auf Kosten etwas langsamerer Einfügungen und Aktualisierungen.