Register for your free account! | Forgot your password?

Go Back   elitepvpers > Popular Games > Metin2 > Metin2 Private Server > Metin2 PServer Guides & Strategies
You last visited: Today at 21:36

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[GUIDE]Datenbank durch MySQL-Indizes beschleunigen

Discussion on [GUIDE]Datenbank durch MySQL-Indizes beschleunigen within the Metin2 PServer Guides & Strategies forum part of the Metin2 Private Server category.

Reply
 
Old   #1
 
Mashkin's Avatar
 
elite*gold: 44
Join Date: May 2010
Posts: 2,053
Received Thanks: 1,747
Arrow [GUIDE]Datenbank durch MySQL-Indizes beschleunigen

Hallo Comm.

Heute wollte ich euch noch mal etwas technisch anspruchvolleres nahebringen.

Das Thema: Indizes in MySQL

Zunächst einmal eine kleine Erklärung, was das bringt:
Aber das sei erst einmal genug der Theorie.
Hier jetzt mal das (bei Metin2 wohl denkbar beste) Beispiel dazu:
Die "player.item"-Tabelle:

Betritt ein Spieler den Server, so werden unter anderem alle seine Items aus der Datenbank abgerufen. In vereinfachter Form sieht das etwa so aus:
Code:
SELECT * FROM player.item WHERE owner_id = 12345;
Hier mal einige Charakteristika dieser Query:
  • gesucht wird anhand der gegebenen "owner_id",
  • es ist nicht bekannt, wie viele Ergebnisse die Query haben wird,
  • die gesuchten Datensätze könnten überall in der Tabelle zu finden sein.

Daraus ergibt sich, dass zur Ausführung dieser simplen Query die gesamte "item"-Tabelle gelesen und durchsucht werden muss.
Bei einem gut besuchten Server können das gut zigtausende bis Millionen von Datensätzen (Items) sein.

Da ein Spieler einen Server nur recht selten betritt, bringt das Verbleiben der Ergebnisse im RAM sehr wenig.
Ganz im Gegenteil: für jeden Spieler muss erneut die gesamte Tabelle durchsucht werden.

Hier kommen jetzt Indizes ins Spiel:
Da die meisten Queries wie oben beschrieben als Suchkriterium das Feld "owner_id" besitzen, ist es sinnvoll einen Index über jenes Feld anzulegen.
Dann können in diesem Index sehr schnell alle gesuchten Datensätze anhand des Feldes "owner_id" gefunden werden (Erinnerung: der Index mit dem Schlüssel "owner_id" ist nach dessen Größe aufsteigend sortiert).
Die Suche des richtigen Bereiches im Index kann mit (vergleichsweise) simplen größer-/kleiner-Vergleichen durchgeführt werden.

Generell lassen sich das Problem und dessen Lösung auf viele andere Szenarien übertragen.
Ein sinnvoller Einsatz des Schemas wäre z.B. auch für die Tabelle "player.player" ein Index über das Feld "level".
Damit ließe sich eine Rangliste mit Level-Sortierung deutlich beschleunigen.

Einrichtung:

Vom Admin eines führenden Servers (ich weiß nicht ob er genannt werden will) habe ich bisher nur positive Rückmeldungen erfahren.
Vor der Einrichtung der Indizes beklagten sich Spieler über sehr lange Ladezeiten bei Mapwechseln und Login.


Ich hoffe, ich konnte euch ein wenig weiter bringen und euch näher an MySQL heranführen.
Vielleicht können einige meine beispielhaften Erläuterungen auf andere Anwendungsgebiete übertragen.
Durch richtige Datenpflege lässt sich einiges an Leistung aus MySQL herausholen und einige Vorgänge erheblich beschleunigen.

MfG,
~M@shkin

Blog-Post:
Mashkin is offline  
Thanks
9 Users
Old 08/07/2012, 05:24   #2
 
iYoshix3's Avatar
 
elite*gold: 0
Join Date: Jun 2010
Posts: 1,264
Received Thanks: 2,019
Danke hat mir ja sehr geholfen und ich denke auch das es anderen
helfen kann / wird.

Mfg

Danke hat mir ja sehr geholfen und ich denke auch das es anderen
helfen kann / wird.

Mfg
iYoshix3 is offline  
Thanks
1 User
Old 08/07/2012, 07:59   #3
 
elite*gold: 0
Join Date: Aug 2009
Posts: 962
Received Thanks: 96
kann ganz erlich in den kleinen release part sorry aber ich gucks mir später man an^^
lautlosertot is offline  
Old 08/07/2012, 09:44   #4
 
Mijago's Avatar
 
elite*gold: 191
Join Date: May 2009
Posts: 1,214
Received Thanks: 2,594
@lautlosertot, ich finde den "Kleinen Release Thread" sowieso total Sinnlos, denn eigentlich steht es im Auge des Betrachters, ob ein Release "Groß" (=sehr nützlich) oder "klein" ist..

Aber nunja, ich Release ja eh nichts mehr..


btt:
Ich wurde letztens auch nach den Indizes gefragt (da hat einer meiner Kontakte mal Navicat durchstöbert hehe), da hab ich's ihm auch erklärt, dass das die DB beschleunigen könnte..

Besonders bei der Quest- und Log-Tabelle ist das von vorteil

lg Mijago
Mijago is offline  
Thanks
2 Users
Old 08/07/2012, 10:27   #5
 
exi°'s Avatar
 
elite*gold: 5
Join Date: Jun 2011
Posts: 1,455
Received Thanks: 554
Klasse Struktur des Textes und super erklärt. Top!
exi° is offline  
Old 08/07/2012, 11:33   #6
 
elite*gold: 0
Join Date: Nov 2011
Posts: 478
Received Thanks: 790
Kann man das nachträglich jederzeit machen
oder direkt am serverstart?

Man bemerkt man einen unterschied?
Zymos is offline  
Old 08/07/2012, 11:41   #7
wild wild son




 
Nick's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 5,829
Received Thanks: 3,369
Gute Struktur & Vorgehensweise! Muss man an dieser Stelle mal erwähnen.
Dementsprechend bringst du das Ganze rüber.
Nick is offline  
Thanks
1 User
Old 08/07/2012, 12:10   #8
 
elite*gold: 17
Join Date: Jan 2009
Posts: 2,538
Received Thanks: 2,405
sry das ich jetzt frage aber die querys bzw mysql reagiert dan auf die indexe von selber oder muss man dann am query oder ähnliches noch irgend etwas machen?

also so wie ich es verstanden habe ist es nur eine mysql technische sache und mysql entscheidet selber ob es sich an dem index orientiert oder nicht?
Perfection- is offline  
Old 08/07/2012, 15:21   #9
 
Mashkin's Avatar
 
elite*gold: 44
Join Date: May 2010
Posts: 2,053
Received Thanks: 1,747
Quote:
Originally Posted by Mijago View Post
btt:
Ich wurde letztens auch nach den Indizes gefragt (da hat einer meiner Kontakte mal Navicat durchstöbert hehe), da hab ich's ihm auch erklärt, dass das die DB beschleunigen könnte..

Besonders bei der Quest- und Log-Tabelle ist das von vorteil

lg Mijago
Quest-Tabelle ja, Log-Tabelle wüsste ich nicht (ist ja eigentlich eher Read-Only).
Quote:
Originally Posted by Zymos View Post
Kann man das nachträglich jederzeit machen
oder direkt am serverstart?

Man bemerkt man einen unterschied?
Wie ich schon sagte:
Quote:
Originally Posted by M@shkin View Post
Aber ACHTUNG: Wenn ein Index komplett neu erstellt wird, kann dies sehr lange dauern und arbeitsintensiv sein.
Bei sehr großen Servern kann das indizieren der "item"-Tabelle mehrere Stunden dauern!

Besser erledigt ihr solche Aufgaben nachts oder sehr früh morgends oder aber während einer (längeren) Wartung.
Am Besten legt ihr die Indizes schon vor dem Serverstart an, dann wird er sich "ganz natürlich" füllen.
Je voller die Tabelle wird, desto länger wird das Erstellen des Index dauern.
Ist der Index erst einmal mit der Tabelle synchron, stört er nicht mehr.

Bei großen Servern kann man sehr gut merken, wie sich Ladezeiten beim Mapwechsel, Login, Lager etc. verkürzen.
Aber auch bei kleineren Servern ist es den Aufwand sicher wert.
Quote:
Originally Posted by .Xero View Post
sry das ich jetzt frage aber die querys bzw mysql reagiert dan auf die indexe von selber oder muss man dann am query oder ähnliches noch irgend etwas machen?

also so wie ich es verstanden habe ist es nur eine mysql technische sache und mysql entscheidet selber ob es sich an dem index orientiert oder nicht?
Beim Ausführen der Query sucht die Engine automatisch nach dem besten "Pfad" zu den gesuchten Datensätzen. "Where"-Klauseln, die das indizierte Feld (z.B. "owner_id") als verpflichtende Bedingung anführen, gewinnen am meisten:
Code:
SELECT * FROM item WHERE owner_id = 12345 AND vnum = 54321;
Ist das indizierte Feld nur optional, sinkt der Vorteil dieses einen Index:
Code:
SELECT * FROM item WHERE owner_id = 12345 OR vnum = 54321;
Solche Queries sollten aber rein logisch ziemlich selten vorkommen.
Mashkin is offline  
Thanks
1 User
Reply

Tags
beschleunigen, index, indizes, mysql, query


Similar Threads Similar Threads
[HowTo] Internet beschleunigen durch AntiVirus!
10/05/2011 - Tutorials - 10 Replies
Ja ich wollte euch mal zeigen wie man sein Internet beschleunigen kann! Als erstes öffnet ihr AntiVirus: Pic-Upload.de - Unbenannt.png Wenn ihr das habt klickt ihr einfach auf: Update starten!
MySQL beschleunigen?
02/10/2011 - Metin2 Private Server - 5 Replies
Hallo, ist es möglich die MySQL Verbindung stabiler zu machen und zu beschleunigen? Weill wenn ich z.B. über Navicat versuche auf eine Tabelle oder Datenbank zuzugreifen, kommt irgend ein komischer Fehler. http://s3.imgimg.de/uploads/mysqlerror90392ba0png .png Hättet ihr vielleicht eine Lösung? Ich brauche auch mega lange über PHP was aufzulisten :/ mfg Freaky
durch PHP in Mysql Datenbank Name oder IP ändern !!!
03/15/2010 - Web Development - 3 Replies
Hallo liebe COM, ich habe ein Problem mit Mysql und PHP. Ich wollte mir ein PHP Script schreiben das auf die Mysql Datenbank (bestimmte Spalte) zugreift und dann mir sagt was da drin steht. Zudem will ich es gleich ändern in was neues! Das heißt ich möchte gern ein Formular haben das anzeigt was grad drin steht und gleichzeitig ich das ändern kann, sodass es auch gleich in der db geändert wird. <?php include("config_common.php");
[HowTo] MySQL-Verbindung beschleunigen
02/12/2010 - Metin2 PServer Guides & Strategies - 35 Replies
Hallo Leute, wie ihr sicherlich schon bemerkt habt, dauert es immer ewig bis Navicat (oder die HP) eine Verbindung mit MySQL aufgebaut haben, oder einen Befehl ausfegührt haben. - Heute zeige ich euch, wie man das beschleunigen kann - sehr stark sogar. Also als erstes mal fahr ihr den Server hoch, und loggt euch ein. Dann gebt ihr ' /etc/rc.d/netif restart ' (ohne die '') ein. So schreibt man das mit dem Englischen Tastatulayout: ' -etc-rc.d-netif restart ' (ohne '').



All times are GMT +2. The time now is 21:36.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.