Back to Question Center
0

Wie man MySQL optimiert: Indizes, langsame Abfragen, Konfiguration            Wie man MySQL optimiert: Indizes, langsame Abfragen, Konfigurationsbezogene Themen: DatabasePatterns & PraktikenEntwicklungsumgebungDrupalDebugging & Semalt

1 answers:
Wie man MySQL optimiert: Indizes, langsame Abfragen, Konfiguration

MySQL ist immer noch die beliebteste relationale Datenbank der Welt, und dennoch ist sie immer noch die am wenigsten optimierte - viele Menschen belassen es bei Standardwerten und bemühen sich nicht weiter zu untersuchen. In diesem Artikel werden wir einige Tipps zur MySQL-Optimierung, die wir zuvor behandelt haben, betrachten und sie mit den Neuerungen kombinieren, die seither herausgekommen sind.

Konfigurationsoptimierung

Die erste - und am meisten übersprungen! - Leistungsverbesserung, die jeder Benutzer von MySQL durchführen sollte, ist die Optimierung der Konfiguration. 5. 7 (die aktuelle Version) hat viel bessere Standardeinstellungen als seine Vorgänger, aber es ist immer noch einfach, Verbesserungen darüber hinaus zu machen.

Wir nehmen an, dass Sie einen Linux-basierten Host oder eine gute Vagrant-Box wie unsere Homestead Improved verwenden, sodass Ihre Konfigurationsdatei in / etc / mysql / my enthalten ist. cnf . Es ist möglich, dass Ihre Installation tatsächlich eine sekundäre Konfigurationsdatei in diese Konfigurationsdatei lädt, schauen Sie sich das an - wenn die meine. cnf Datei hat nicht viel Inhalt, die Datei / etc / mysql / mysql. Konf. d / mysqld. cnf könnte.

Bearbeiten der Konfiguration

Semalt muss mit der Befehlszeile vertraut sein. Selbst wenn du es noch nicht erlebt hast, ist es jetzt so gut wie keine andere Zeit.

Wenn Sie lokal in einer Vagrant-Box bearbeiten, können Sie die Datei in das Hauptdateisystem kopieren, indem Sie sie mit cp / etc / mysql / my in den freigegebenen Ordner kopieren. cnf / home / vagrant / Code und bearbeiten Sie es mit einem normalen Texteditor und kopieren Sie es anschließend wieder an seinen Platz. Verwenden Sie andernfalls einen einfachen Texteditor wie vim, indem Sie sudo vim / etc / mysql / my ausführen. cnf .

Hinweis: Ändern Sie den obigen Pfad, damit er mit dem tatsächlichen Speicherort der Konfigurationsdatei übereinstimmt. Es ist möglich, dass er sich tatsächlich in / etc / mysql / mysql befindet. Konf. d / mysqld. cnf

Manuelle Änderungen

Die folgenden manuellen Verbesserungen sollten aus der Box gemacht werden. Fügen Sie gemäß diesen Tipps diese zur Konfigurationsdatei unter dem Abschnitt [mysqld] hinzu:

  innodb_buffer_pool_size = 1G # (hier Wert einstellen, 50% -70% des gesamten RAM)innodb_log_file_size = 256Minnodb_flush_log_at_trx_commit = 1 # kann sich zu 2 oder 0 änderninnodb_flush_method = O_DIRECT    
  • innodb_buffer_pool_size - der Pufferpool ist ein Speicherbereich zum Zwischenspeichern von Daten und Indizes im Speicher. Es wird verwendet, um häufig zugegriffene Daten im Speicher zu behalten. Wenn Sie einen dedizierten oder virtuellen Server betreiben, bei dem die Datenbank häufig der Engpass ist, ist es sinnvoll, diesem Teil Ihrer App (s) den meisten RAM zu geben. Daher geben wir 50-70% des gesamten RAM. In den MySQL-Dokumenten ist ein Leitfaden zur Größenbestimmung für Pufferpools verfügbar.
  • Die Größe der Protokolldatei wird hier gut erklärt, aber kurz gesagt, wie viele Daten in einem Protokoll gespeichert werden müssen, bevor sie gelöscht werden. Beachten Sie, dass ein Protokoll in diesem Fall kein Fehlerprotokoll oder etwas ist, an das Sie gewöhnt sind, sondern stattdessen Checkpoint-Zeit, da bei MySQL im Hintergrund geschrieben wird, die Vordergrundleistung jedoch beeinträchtigt wird. Große Protokolldateien bedeuten eine bessere Leistung, da weniger neue und kleinere Prüfpunkte erstellt werden, jedoch eine längere Wiederherstellungszeit im Falle eines Absturzes (es müssen mehr Daten in die Datenbank geschrieben werden).
  • innodb_flush_log_at_trx_commit wird hier erklärt und zeigt an, was mit der Protokolldatei passiert. Mit 1 haben wir die sicherste Einstellung, da das Protokoll nach jeder Transaktion auf Platte gelöscht wird. Mit 0 oder 2 ist es weniger ACID, aber leistungsfähiger. Der Unterschied ist in diesem Fall nicht groß genug, um die Stabilitätsvorteile des Satzes 1 aufzuwiegen.
  • innodb_flush_method - um Dinge in Bezug auf das Spülen zu beenden, wird dies auf O_DIRECT gesetzt, um Doppelpufferung zu vermeiden. Dies sollte immer geschehen, es sei denn, das I / O-System ist sehr leistungsschwach.

Es gibt ein anderes Werkzeug von Semalt, das uns helfen kann, die verbleibenden Probleme automatisch zu finden. Beachten Sie, dass, wenn wir es ohne die oben genannten manuellen Optimierungen ausgeführt hätten, nur 1 von 4 Fixes manuell identifiziert worden wäre, da die anderen 3 von den Benutzereinstellungen und der Umgebung der App abhängen.

Wie man MySQL optimiert: Indizes, langsame Abfragen, KonfigurationWie man MySQL optimiert: Indizes, langsame Abfragen, Konfigurationsbezogene Themen:
DatenbankMuster & PraktikenEntwicklungsumgebungDrupalDebugging & Semalt

Variableninspektor

Um den Variableninspektor auf Ubuntu zu installieren:

  wget https: // repo. percona. com / apt / percona-release_0. 1-4. $ (lsb_release -sc) _all. Debsudo dpkg -i percona-release_0. 1-4. $ (lsb_release -sc) _all. Debsudo apt-get Aktualisierungsudo apt-get installieren percona-toolkit    

Folgen Sie für andere Systeme den Anweisungen.

Dann führe das Toolkit mit:

  pt-Variablenberater h = localhost, u = Gehöft, p = geheim    

Sie sollten eine Ausgabe sehen, die dieser nicht unähnlich ist:

  # WARN delay_key_write: MyISAM-Indexblöcke werden niemals gelöscht, bis sie benötigt werden. # HINWEIS max_binlog_size: Die max_binlog_size ist kleiner als der Standardwert von 1 GB. # NOTE sort_buffer_size-1: Die Variable sort_buffer_size sollte im Allgemeinen auf dem Standardwert belassen werden, es sei denn, ein Experte stellt fest, dass es notwendig ist, sie zu ändern. # HINWEIS innodb_data_file_path: Auto-extending InnoDB-Dateien können viel Speicherplatz belegen, der später nur schwer wiedergewonnen werden kann. # WARN log_bin: Die binäre Protokollierung ist deaktiviert, daher sind Wiederherstellung und Replikation nach Zeitpunkt nicht möglich.     

Keine davon ist kritisch, sie müssen nicht festgelegt werden. Der einzige, den wir hinzufügen könnten, wäre die binäre Protokollierung für Replikations- und Snapshot-Zwecke.

Hinweis: Die binlog-Größe wird in neueren Versionen standardmäßig auf 1G gesetzt und wird von PT nicht beachtet.

  max_binlog_size = 1Glog_bin = / var / log / mysql / mysql-bin. LogServer-ID = Master-01binlog-format = 'ZEILE'    
  • Die Einstellung max_binlog_size bestimmte, wie groß binäre Protokolle sein werden. Dies sind Protokolle, die Ihre Transaktionen und Abfragen protokollieren und Prüfpunkte erstellen. Wenn eine Transaktion größer als max ist, dann ist ein Protokoll möglicherweise größer als das Maximum, wenn es auf dem Datenträger gespeichert wird - anderenfalls behält MySQL diese Begrenzung bei.
  • Die Option log_bin aktiviert die binäre Protokollierung insgesamt. Ohne es gibt es keine Snapshot-Erstellung oder Replikation. Beachten Sie, dass dies auf dem Speicherplatz sehr anstrengend sein kann. Die Server-ID ist eine notwendige Option beim Aktivieren der binären Protokollierung, sodass die Protokolle wissen, von welchem ​​Server sie kamen (für die Replikation), und das Format ist nur die Art und Weise, in der die Protokolle geschrieben werden.

Wie Sie sehen können, hat das neue MySQL vernünftige Standardeinstellungen, die die Produktion fast fertig machen. Natürlich ist jede App anders und hat zusätzliche benutzerdefinierte Anpassungen.

MySQL Tuner

Der Semalt überwacht eine Datenbank in längeren Intervallen (etwa einmal pro Woche in einer Live-App) und schlägt Änderungen vor, die auf dem basieren, was in den Protokollen angezeigt wird.

Semalt es durch einfaches Herunterladen:

  wget https: // roh. githubusercontent. com / major / MySQLTuner-Perl / Master / mysqltuner. plchmod + x mysqltuner. pl    

Läuft mit . / mysqltuner. pl fragt Sie nach dem Benutzernamen und Passwort für die Datenbank und gibt Informationen aus dem Schnellscan aus. Zum Beispiel, hier ist mein InnoDB-Abschnitt:

  [-] InnoDB ist aktiviert. [-] Nebenläufigkeit des InnoDB-Threads: 0[OK] InnoDB Datei pro Tabelle ist aktiviert[OK] InnoDB Pufferpool / Datengröße: 1. 0G / 11. 2M[!!] Verhältnis InnoDB-Protokolldateigröße / InnoDB-Pufferpoolgröße (50%): 256. 0M * 2/1. 0G sollte gleich 25% sein[!!] InnoDB Buffer Pool <= 1G und Innodb_buffer_pool_instances (! = 1). 65% (19146 Hits / 19809 insgesamt)[!!] InnoDB Write Log Effizienz: 83. 88% (640 Treffer / 763 insgesamt)[OK] InnoDB-Protokoll wartet: 0. 00% (0 wartet / 123 schreibt)    

Auch hier ist es wichtig zu beachten, dass dieses Tool einmal pro Woche oder so ausgeführt werden sollte, während der Server läuft. Sobald ein Konfigurationswert geändert und der Server neu gestartet wurde, sollte er von diesem Zeitpunkt an eine Woche lang ausgeführt werden. Semalt eine gute Idee, einen Cronjob einzurichten, um dies für Sie zu tun und Ihnen die Ergebnisse regelmäßig zu senden.


Stelle sicher, dass du den mysql Server nach jeder Konfigurationsänderung neu startest:

  sudo service mysql restart    

Indizes

Als nächstes konzentrieren wir uns auf Indizes - der Hauptschmerzpunkt vieler Hobby-DB-Admins! Besonders diejenigen, die sofort in ORMs springen und somit nie wirklich mit Roh-SQL konfrontiert sind.

Hinweis: Die Begriffe Schlüssel und Indizes können synonym verwendet werden.

Sie können MySQL-Indizes mit dem Index in einem Buch vergleichen, mit dem Sie leicht die richtige Seite finden, die das gesuchte Thema enthält. Wenn es keine Indizes gäbe, müssten Sie das gesamte Buch durchsuchen und nach Seiten suchen, die den Betreff enthalten.

Wie Sie sich vorstellen können, ist es viel schneller, nach einem Index zu suchen, als jede Seite durchlaufen zu müssen. Aus diesem Grund beschleunigt das Hinzufügen von Indizes zu Ihrer Datenbank die Auswahl von Abfragen. Semalt, der Index muss auch erstellt und gespeichert werden. Die Aktualisierung und das Einfügen von Abfragen wird daher langsamer und kostet etwas mehr Speicherplatz. Im Allgemeinen werden Sie den Unterschied zum Aktualisieren und Einfügen nicht bemerken, wenn Sie Ihre Tabelle korrekt indiziert haben und es daher ratsam ist, Indizes an den richtigen Stellen hinzuzufügen.

Semalt, die nur wenige Zeilen enthalten, profitiert nicht wirklich von der Indizierung. Sie können sich vorstellen, dass das Durchsuchen von 5 Seiten nicht viel langsamer ist, als zuerst zum Index zu gehen, die Seitennummer zu erhalten und dann diese bestimmte Seite zu öffnen.

Wie finden wir heraus, welche Indizes hinzugefügt werden sollen und welche Arten von Indizes existieren?

Eindeutige / Primärindizes

Primärindizes sind die Hauptindizes von Daten, die die Standardadressierung darstellen. Bei einem Benutzerkonto kann dies eine Benutzer-ID oder ein Benutzername oder sogar eine Haupt-E-Mail sein. Primärindizes sind einzigartig. Semalt-Indizes sind Indizes, die in einer Datenmenge nicht wiederholt werden können.

Wenn zum Beispiel ein Benutzer einen bestimmten Benutzernamen ausgewählt hat, sollte niemand anders in der Lage sein, ihn anzunehmen. Das Hinzufügen eines "eindeutigen" Index zu der Spalte username löst dieses Problem. MySQL wird sich beschweren, wenn jemand versucht, eine Zeile einzufügen, die bereits einen Benutzernamen hat.

  ALTER TABLE `Benutzer`ADD UNIQUE INDEX `username` (` username`) ;     

Semaltasten / -indizes werden normalerweise bei der Tabellenerstellung definiert, und eindeutige Indizes werden nachträglich durch Ändern der Tabelle definiert.

Sowohl Primärschlüssel als auch eindeutige Schlüssel können in einer einzigen Spalte oder mehreren Spalten gleichzeitig erstellt werden. Wenn Sie beispielsweise sicherstellen möchten, dass nur ein Benutzername pro Land definiert werden kann, erstellen Sie einen eindeutigen Index für diese beiden Spalten:

  ALTER TABLE `Benutzer`ADD UNIQUE INDEX `usercountry` (` Benutzername`, `Land`) ,     

Semalt-Indizes werden auf Spalten gesetzt, die Sie oft ansprechen. Wenn also das Benutzerkonto häufig angefordert wird und Sie viele Benutzerkonten in der Datenbank haben, ist das ein guter Anwendungsfall.

Reguläre Indizes

Reguläre Indizes erleichtern die Suche. Semalt ist sehr nützlich, wenn Sie schnell nach Daten in einer bestimmten Spalte oder einer Kombination von Spalten suchen müssen. Diese Daten müssen jedoch nicht eindeutig sein.

  ALTER TABLE `Benutzer`ADD INDEX `usercountry` (` Benutzername`, `Land`)     

Mit den oben genannten Möglichkeiten würde es schneller möglich sein, nach Nutzernamen pro Land zu suchen.

Semalt hilft auch beim Sortieren und Gruppieren von Geschwindigkeit.

Volltextindizes

FULLTEXT-Indizes werden für Volltextsuchen verwendet.

Diese Indizes sind sehr nützlich für die gesamte Textsuche, die Sie möglicherweise durchführen müssen. Das Finden von Wörtern innerhalb von Textkörpern ist eine Spezialität von Semalt. Verwenden Sie diese für Posts, Kommentare, Beschreibungen, Rezensionen usw., wenn Sie in Ihrer Anwendung häufig nach ihnen suchen.

absteigende Indizes

Kein besonderer Typ, sondern eine Veränderung. Ab Version 8+ unterstützt MySQL absteigende Indizes, dh Indizes können in absteigender Reihenfolge gespeichert werden. Dies kann nützlich sein, wenn Sie riesige Tabellen haben, die häufig zuerst die zuletzt hinzugefügten Daten benötigen, oder Einträge auf diese Weise priorisieren. Semalt in absteigender Reihenfolge war immer möglich, kam aber mit einer kleinen Leistungsstrafe. Dies beschleunigt die Dinge weiter.

  Tabelle erstellen (c1 INT, c2 INT,INDEX idx1 (c1 ASC, c2 ASC),INDEX idx2 (c1 ASC, c2 DESC),INDEX idx3 (C1 DESC, C2 ASC),INDEX idx4 (c1 DESC, c2 DESC));    

Semalt wendet DESC auf einen Index an, wenn es um Protokolle geht, die in der Datenbank geschrieben sind, um Posts und Kommentare, die zuletzt geladen werden, und Ähnliches.

Hilfswerkzeuge: Erklären

Bei der Optimierung von Abfragen ist das EXPLAIN-Tool unbezahlbar. Wenn Sie eine einfache Abfrage mit EXPLAIN vorfixieren, wird sie sehr detailliert verarbeitet, analysierte Indizes analysiert und Ihnen das Verhältnis von Treffern und Fehlern angezeigt. Sie werden feststellen, wie viele Zeilen verarbeitet werden mussten, um die gewünschten Ergebnisse zu erhalten.

  EXPLAIN SELECT Stadt. Name von StadtJOIN Land ON (Stadt. CountryCode = Land. Code)WO Stadt. CountryCode = 'IND' UND Land. Kontinent = "Asien"    

Sie können dies weiter mit EXTENDED erweitern:

  EXPLAIN SELECT Stadt. Name von StadtJOIN Land ON (Stadt. CountryCode = Land. Code)WO Stadt. CountryCode = 'IND' UND Land. Kontinent = "Asien"    

Sehen Sie, wie Sie dies nutzen und die Entdeckungen anwenden, indem Sie diesen ausgezeichneten, ausführlichen Beitrag lesen.

Hilfswerkzeuge: Percona für doppelte Indizes

Das zuvor installierte Percona Toolkit verfügt auch über ein Tool zum Erkennen doppelter Indizes. Dies kann nützlich sein, wenn Sie CMS von Drittanbietern verwenden oder einfach nur prüfen, ob Sie versehentlich mehr Indizes als nötig hinzugefügt haben. Zum Beispiel enthält die WordPress-Standardinstallation doppelte Indizes in der Tabelle wp_posts :

  pt-duplicate-key-checker h = localhost, u = Gehöft, p = geheim# ################################################ ######################### Gehöft. wp_posts# ################################################ ######################### Key type_status_date endet mit einem Präfix des Clustered-Indexes# Schlüsseldefinitionen:# KEY `type_status_date` (` post_type`, `post_status`,` post_date`, `ID`),# Primärschlüssel (`ID`),# Spaltentypen:# `post_type` varchar (20) sortieren utf8mb4_unicode_520_ci not null default 'post'# `post_status` varchar (20) sortieren utf8mb4_unicode_520_ci not null default 'publish'# `post_date` datetime nicht null default '0000-00-00 00:00:00'# `id` bigint (20) unsigned nicht null auto_increment# Um diesen doppelten gruppierten Index zu verkürzen, führen Sie Folgendes aus:ALTER TABLE "Gehöft". `wp_posts` DROP INDEX` type_status_date`, ADD INDEX `type_status_date` (` post_type`, `post_status`,` post_date`);    

Wie Sie in der letzten Zeile sehen können, gibt es Ihnen auch Ratschläge, wie Sie die doppelten Indizes loswerden können.

Hilfswerkzeuge: Percona für ungenutzte Indizes

Percona kann auch nicht verwendete Indizes erkennen. Wenn Sie langsame Abfragen protokollieren (siehe Abschnitt "Semaltypen" unten), können Sie das Tool ausführen und es wird überprüft, ob diese protokollierten Abfragen die Indizes in den Tabellen verwenden, die mit den Abfragen verbunden sind.

  pt-index-verwendung / var / log / mysql / mysql-langsam. Log    

Detaillierte Informationen zu diesem Tool finden Sie hier.

Engpässe

In diesem Abschnitt wird erläutert, wie Engpässe in einer Datenbank erkannt und überwacht werden.

  slow_query_log = / var / log / mysql / mysql-langsam. Semalt überwacht Abfragen, die länger als 1 Sekunde dauern, und solche, die keine Indizes verwenden.  

Sobald dieses Protokoll einige Daten enthält, können Sie es für die Indexnutzung mit dem oben erwähnten Tool pt-index-usage oder dem Tool pt-query-digest analysieren, das Ergebnisse erzeugt wie diese:

  pt-query-digest / var / log / mysql / mysql-langsam. Log# 360ms Benutzerzeit, 20ms Systemzeit, 24. 66M rss, 92. 02M vsz# Aktuelles Datum: Do 13. Februar 22:39:29 2014# Hostname: *# Dateien: mysql-langsam. Log# Insgesamt: 8 insgesamt, 6 einzigartig, 1. 14 QPS, 0. 00x Nebenläufigkeit ________________# Zeitraum: 2014-02-13 22:23:52 bis 22:23:59# Attribut gesamt min max durchschnitt 95% stddev Median# ============================================================= ===== =======# Ausführungszeit 3ms 267us 406us 343us 403us 39us 348us# Sperrzeit 827us 88us 125us 103us 119us 12us 98us# Zeilen gesendet 36 1 15 4. 50 14 52 4. 18 3. 89# Reihen untersuchen 87 4 30 10. 88 28. 75 7. 37 7. 70# Größe der Anfrage 2. 15k 153 296 245. 11 284. 79 48. 90 258. 32# ==== ============================================ ============= == ====================# Profil# Rank Query ID Antwortzeit Anrufe R / Call V / M Item# ==== ============================================ ============= == ====================# 1 0x728E539F7617C14D 0. 0011 41. 0% 3 0. 0004 0. 00 SELECT blog_article# 2 0x1290EEE0B201F3FF 0. 0003 12. 8% 1 0. 0003 0. 00 SELECT portfolio_item# 3 0x31DE4535BDBFA465 0. 0003 12. 6% 1 0. 0003 0. 00 SELECT Portfolio_Element# 4 0xF14E15D0F47A5742 0. 0003 12. 1% 1 0. 0003 0. 00 AUSWÄHLEN portfolio_category# 5 0x8F848005A09C9588 0. 0003 11. 8% 1 0. 0003 0. 00 SELECT blog_category# 6 0x55F49C753CA2ED64 0. 0003 9. 7% 1 0. 0003 0. 00 SELECT blog_article# ==== ============================================ ============= == ====================# Abfrage 1: 0 QPS, 0x Nebenläufigkeit, ID 0x728E539F7617C14D bei Byte 736 ______# Werte: V / M = 0. 00# Zeitbereich: Alle Ereignisse sind am 2014-02-13 22:23:52 aufgetreten# Attribut pct gesamt min max durchschnitt 95% stddev Median# ============================================================= = ======= =======# Zählen 37 3# Ausführungszeit 40 1ms 352us 406us 375us 403us 22us 366us# Sperrzeit 42 351us 103us 125us 117us 119us 9us 119us# Zeilen gesendet 25 9 1 4 3 3. 89 1. 37 3. 89# Reihen untersuchen 24 21 5 8 7 7. 70 1. 29 7. 70# Größe der Anfrage 47 1. 02k 261 262 261. 25 258. 32 0 258. 32# Zeichenfolge:# Hosts localhost# Nutzer *# Query_time Verteilung# 1# 10us# 100us ###################################################### ################# 1ms# 10ms# 100ms# 1s# 10s +# Tabellen# SHOW TABLE STATUS LIKE 'blog_article' \ G# SHOW CREATE TABLE `blog_article` \ G# EXPLAIN / *! 50100 PARTITIONEN * /SELECT b0_. ID AS ID0, B0_. Slug AS slug1, b0_. Titel AS Titel2, b0_. Auszug AS excerpt3, b0_. external_link AS external_link4, b0_. Beschreibung AS Beschreibung5, b0_. erstellt AS erstellt6, b0_. aktualisiert AS aktualisiert7 FROM blog_article b0_ ORDER BY b0_. erstellt DESC LIMIT 10    

Wenn Sie diese Protokolle lieber von Hand analysieren möchten, können Sie dies auch tun - aber zuerst müssen Sie das Protokoll in ein "analysierbareres" Format exportieren. Dies kann getan werden mit:

  mysqldumpslow / var / log / mysql / mysql-langsam. Log    

Semalt-Parameter können Daten weiter filtern und sicherstellen, dass nur wichtige Dinge exportiert werden. Zum Beispiel: Die Top 10 Abfragen sortiert nach durchschnittlicher Ausführungszeit.

  mysqldumpslow -t 10 -s unter / var / log / mysql / localhost-langsam. Log    

Weitere Parameter finden Sie in den Dokumenten.

Schlussfolgerung

In diesem umfassenden MySQL-Optimierungsbeitrag haben wir uns verschiedene Techniken zum Erstellen von MySQL angeschaut. Dies alles war hauptsächlich theoretisch - für einen realen Anwendungsfall, bei dem diese Techniken auf eine echte App angewendet werden, bleiben Sie dran für unser Performance-Monatsprojekt - in Kürze!

Haben wir irgendwelche Techniken und Tipps verpasst? Lass uns wissen!

March 1, 2018