Wie teuer ist das Öffnen und Schließen einer DB-Verbindung?

15

Wie rechenintensiv ist das Öffnen und Schließen einer DB-Verbindung (für eine Web-App) in MySQL?

  • ... wenn sich die DB-Software auf localhost befindet?
  • ... wenn sich die DB-Software auf einem anderen Rechner befindet?
ThinkingMonkey
quelle

Antworten:

12

Überlegen Sie, wie viel Speicher pro DB-Verbindung zugewiesen wird. Welche Dinge müssen zugeteilt werden? Laut MySQL 5.0 Certification Study Guide, Seite 357 :

Der Server verwaltet mehrere Puffer für jede Clientverbindung. Einer wird als Kommunikationspuffer für den Informationsaustausch mit dem Client verwendet. Andere Puffer werden pro Client zum Lesen von Tabellen und zum Ausführen von Verknüpfungs- und Sortiervorgängen verwaltet.

Welche Einstellungen gelten für die Verbindungspuffer?

Es braucht Zeit, um diese Puffer zuzuweisen und die Zuordnung aufzuheben, wenn eine Verbindung hergestellt wird. Vergessen Sie nicht, die Summe dieser Werte mit max_connections zu multiplizieren . Bitte verwenden Sie mysql_pconnect nicht, da PHP und die persistenten Verbindungen von MySQL nicht gut miteinander auskommen. Hier sind zwei informative Links zu diesem Thema:

In Umgebungen mit starkem Lesezugriff und starkem Schreibzugriff, wie z. B. OLTP, wäre dies in Bezug auf die RAM-Auslastung und die mögliche Sperrung aufgrund des Austauschs im Betriebssystem teuer. Auf einer Low-Write, Low_read-Website würde ich mir nicht so viele Sorgen machen.

RolandoMySQLDBA
quelle
10

Ich bin nicht sicher, ob es darauf ankommt, "wie viel teurer" es ist. Dies ist sicherlich teurer als die erneute Verwendung derselben Verbindung. Was Sie beobachten werden, hängt davon ab, ob Sie das Verbindungspooling richtig verwenden, wie voll Ihr Pool ist, welche Ressourcen auf der Box verfügbar sind usw.

Wenn Sie eine Schleife ausführen, um eine Interaktion mit der Datenbank durchzuführen, ist es im Allgemeinen weitaus besser, dieselbe aktive Verbindung erneut zu verwenden, als innerhalb der Schleife zu öffnen und zu schließen (ein Antimuster, das ich häufig sehe). .

Aaron Bertrand
quelle
4

Das Dilemma zwischen der Wiederverwendung und dem Abreißen und Wiederaufbauen eines Objekts (beides mit Vor- und Nachteilen) kann oft mit einem Kompromiss gelöst werden: Zwischenspeichern des Objekts für eine begrenzte Zeit (dh mit Ablauf). Wenn häufig auf das Objekt zugegriffen wird, wird es weiterhin verwendet. Wird es jedoch längere Zeit nicht verwendet, wird es durch einen Ablaufmechanismus gelöscht und muss neu erstellt werden, wenn es erneut benötigt wird.

Ein System kann einen globalen Hook für diese Art von Caches haben, der aufgerufen wird, wenn der Arbeitsspeicher knapp wird, wodurch alle von ihnen veranlasst werden, kürzlich nicht verwendete Objekte zu löschen.

Kumpel
quelle
2

Mysql speichert Verbindungen (oder Threads) im Thread-Cache (thread_cache_size). Der Maximalwert dafür ist 100. Wenn der Client die Verbindung schließt, wird er an den Cache zurückgegeben. Wenn eine neue Verbindung geöffnet wird, wird der Thread-Cache überprüft. Wenn das System sehr ausgelastet ist, kann das Öffnen und Schließen der Verbindung teuer werden, insbesondere bei langen Abfragen.

https://dev.mysql.com/doc/refman/5.6/de/connection-threads.html Wenn Sie sich Mysql Enterprise leisten können, können Sie das in Mysql 5.6 implementierte Plug-in für den Thread-Pool verwenden.

greenlitmysql
quelle