Tips zum schnelleren zugriff auf eine Mysql DB.

Katzehuhn

Erfahrenes Mitglied
Kann mir jemand ein paar Tips geben wie man den Zugriff auf eine sehr große Mysql DB erhöht? Das er nur das gebrauchte möglich schnell ausliest. Hat da jemand ein paar nützliche Tips? Programmiere gerade ein Onlinegame, Map usw funktionieren schon recht gut nur sind die Zugriffszeiten ein wenig zu hoch, also wer ein paar Vorschläge hat immer her damit^^. ( Wenn ich zb aus einer DB mit 4000 Einträgen ein WHERE mache das nur auf einen Eintrag zutrifft wird dann trotzdem die ganze DB überprüft? )
Danke;)
 
- In der Abfrage solltest du nicht SELECT * verwenden, sondern die tatsächlichen Felder auslesen.
- Zählereien in Schleifen solltest du vermeiden, vor Allem bei for()
Also nicht:
PHP:
for($i=0;$i<count($array);$i++)
sondern:
PHP:
$array_cnt = count($array);
for($i=0;$i<$array_cnt;$i++)
- Die "ID" der Tabelle sollte Primary sein
- Index z.b. auf nickname setzen

Fällt mir so spontan ein.
 
Katzehuhn hat gesagt.:
Kann mir jemand ein paar Tips geben wie man den Zugriff auf eine sehr große Mysql DB erhöht?
Erstens durch eine vernünftige Tabellenstruktur und zweitens durch gut formulierte Abfragen ;)

Wenn ich zb aus einer DB mit 4000 Einträgen ein WHERE mache das nur auf einen Eintrag zutrifft wird dann trotzdem die ganze DB überprüft?
Das kommt darauf an. Wenn du z.B. nur nach dem Eintrag mit einer bestimmten ID suchst (Feld mit Eigenschaft PRIMARY), dann müssen in der Regel nicht alle Datensätze abgegrast werden. Andernfalls möglicherweise schon - kommt immer auf die genauen Bedingungen drauf an.

Ohne dass du Angaben über deine Datenbankstruktur und deine Abfragen machst, kann man dir da aber wohl auch nicht genauer helfen. Also, lass mal bisschen was sehen :)

(verschoben)
 
ok ich stell einfach ma ein paar abfragen und sag was sie machen sollen:

Sollt ich darauf schauen das wenn ich zb ein VARCHAR Feld hab, das nur so groß ist wie max benötigt? (bzw ein TINYINT Feld zunehmen, oder is das egal da ich die größe eh selber angeben kann? )

Gibt es eine bessere ( schnellere) Form um Daten auszulesen als mir dieser Schleife?:
while($row = mysql_fetch_object($lesen)) ?

Meine Karten DB hat 3 Eintrage: X-Achse Y-Achse FS_Eigenschaften (gib aber keine ID und keinen Primärschlüssel)
Ich frage einfach ab wo sich der Benutzer befindet, errechne daraus die benötigten Felder und such mir diese aus der DB.

Also mach ich immer ein LEFT join um die Eigenschaften zu laden, is es vl besser die Eigenschaften direkt in die Karten DB zu schreiben?

Belasten If-Abfragen den Server? gleiches zu while u for^^

:)danke

Edit:Wenn ich schon dabei bin:) Kann mir wer ne Seite sagen mit dennen ich Sachen exakt deklarieren kann? also ich hab JS mit Php kombiniert aber der gibt mir mein <br> das in einer PHP-Variable steht als Text aus. Wie sag ich zb das der Explorer diesen Befehl als HTML Befehl deklarieren soll?^^
 
Zuletzt bearbeitet:
Katzehuhn hat gesagt.:
ok ich stell einfach ma ein paar abfragen und sag was sie machen sollen:
Puh, dann mal los

Katzehuhn hat gesagt.:
Sollt ich darauf schauen das wenn ich zb ein VARCHAR Feld hab, das nur so groß ist wie max benötigt? (bzw ein TINYINT Feld zunehmen, oder is das egal da ich die größe eh selber angeben kann? )
Jo, eine kleineres VARCHAR Feld, z.b. anstatt 255 nur 100 mach den evtl. Index schneller.

Katzehuhn hat gesagt.:
Gibt es eine bessere ( schnellere) Form um Daten auszulesen als mir dieser Schleife?:
while($row = mysql_fetch_object($lesen)) ?
Ja, du wirst den Datensatz kaum als direktes Objekt brauchen, in 99,9% der Fälle reicht ein Array.
Recht schnell ist dann zum Beispiel das hier:
PHP:
<?php
$query = mysql_query('SELECT ....;');
while($rows=mysql_fetch_array($query))
    $daten[] = $rows;
$daten_cnt = count($daten);
?>
Dann hast du ein mehrdimensionales Array, das du mit $daten[arrayposition][feldname] ansprechen kannst.

Katzehuhn hat gesagt.:
Meine Karten DB hat 3 Eintrage: X-Achse Y-Achse FS_Eigenschaften (gib aber keine ID und keinen Primärschlüssel)
Ich frage einfach ab wo sich der Benutzer befindet, errechne daraus die benötigten Felder und such mir diese aus der DB.
Setz nen primarykey vorne ran und du kannst immer nen datensatz explizit ansprechen und die koordinaten indizieren, für schnelleren zugriff.

Katzehuhn hat gesagt.:
Also mach ich immer ein LEFT join um die Eigenschaften zu laden, is es vl besser die Eigenschaften direkt in die Karten DB zu schreiben?
möglicherweise, müßte ich mal die DB sehn

Katzehuhn hat gesagt.:
Belasten If-Abfragen den Server? gleiches zu while u for^^
Jeder code belastet den server..... natürlich wird er mehr belastet, wenn er dinge n-mal durchlaufen muss.
Katzehuhn hat gesagt.:
bitte :D

Katzehuhn hat gesagt.:
Edit:Wenn ich schon dabei bin:) Kann mir wer ne Seite sagen mit dennen ich Sachen exakt deklarieren kann? also ich hab JS mit Php kombiniert aber der gibt mir mein <br> das in einer PHP-Variable steht als Text aus. Wie sag ich zb das der Explorer diesen Befehl als HTML Befehl deklarieren soll?^^
Quelltext please.
 
<div id="bla" style="display:inline;"> </div>
<script type="text/javascript" language="JavaScript">
function textAndPic(obj, text) {
document.getElementById("bla").firstChild.nodeValue = text;
obj.firstChild.setAttribute("src", pic);
}
</script>

<?php
$blubb3 = irgndwas;
$test = <br>;
echo '<a href="index.php?site=map2&x='.$kox2.'&y='.$koy2.'" onMouseOver="textAndPic(this, \''.$blubb3.$test.'\');"><img src="bilder/max.GIF" width="60" height="60" border="0"></a>';
?>

Ausgabe = irgendwas <br>

^^danke nochmals, hast ma wirklich geholfen
 
Katzehuhn hat gesagt.:
<div id="bla" style="display:inline;"> </div>
<script type="text/javascript" language="JavaScript">
function textAndPic(obj, text) {
document.getElementById("bla").firstChild.nodeValue = text;
obj.firstChild.setAttribute("src", pic);
}
</script>

<?php
$blubb3 = irgndwas;
$test = <br>;
echo '<a href="index.php?site=map2&x='.$kox2.'&y='.$koy2.'" onMouseOver="textAndPic(this, \''.$blubb3.$test.'\');"><img src="bilder/max.GIF" width="60" height="60" border="0"></a>';
?>

Ausgabe = irgendwas <br>

^^danke nochmals, hast ma wirklich geholfen


In Sachen Quelltext-Lesbarkeit solltest du mal einen Kurs machen, oder beim worst-case-wettbewerb anmelden hihi.
ich hab x-mal, sorry, Programmierer-technisch richtig, n-mal das lesen müssen.

$blubb3 = "irgndwas";
$test = "<br>";
mal grundsätzlich.....

Das Problem dürfte ein JS-Fehler sein, wahrscheinlich auch nur ne Interpunktion, ich sehs aber nicht, bin kein JS'ler ;)
 
Ceraph hat gesagt.:
Ja, du wirst den Datensatz kaum als direktes Objekt brauchen, in 99,9% der Fälle reicht ein Array.
Recht schnell ist dann zum Beispiel das hier:
PHP:
<?php
$query = mysql_query('SELECT ....;');
while($rows=mysql_fetch_array($query))
    $daten[] = $rows;
$daten_cnt = count($daten);
?>
Geschwindigkeitstechnisch macht das keinen Unterschied, weil es (prinzipiell) nur eine andere Darstellung ist, man hat mit der Instanz eines Datensatzes ja keine Funktionen zur Verfuegung. Ist eine reine Stilfrage. Das Objekt hat ja keine eigenen Methoden.
 
Ich hatte das mal getestet mit einer tabelle mit 15 Feldern, davon 3 TEXT und 12.000 Datensätzen.
mysql_fetch-_array() arbeitete konstant fast ne halbe sekunde schneller, als die objects-variante.

Begründen kann ich das leider nicht, warum das eine schneller ist, als das andere.
 
Ein etwas banaler Tipp, den wahrscheinlich jeder schonmal gehört hat:
Vermeide Querys!
Es ist nach meiner Erfahrung deutlich besser, Tabellen mit 1:n- oder m:n-Beziehungen mit JOINs zu verknüpfen und in der Abfrage-Schleife auf die Änderung der "Haupttabellen-ID" zu achten, als erst die Haupttabelle einzulesen und in der Schleife für jedes Element die passenden Einträge aus der verknüpften Tabelle zu ziehen.
Kurzes Beispiel (cat ist die Tabelle für Kategorien und subCat die Tabelle für Unterkategorien. parentId verweist auf die id von cat):
PHP:
$res=mysql_query("SELECT * FROM cat LEFT JOIN subCat ON (subCat.parentId = cat.catId) ORDER BY cat.catId");
$id=0;
while ($row=mysql_fetch_assoc($res)) {
    if ($id!=$row['catId']) {
        echo "<b>".$row['catName']."</b><br>";
        $id = $row['catId'];
    }
    echo $row['subCatName']."<br>";

}
ist i.d.R. schneller als
PHP:
$res=mysql_query("SELECT * FROM cat ORDER BY cat.catId");
while ($row=mysql_fetch_assoc($res)) {
    echo "<b>".$row['catName']."</b><br>";
    $res2=mysql_query("SELECT * FROM subCat WHERE subCat.parentId = ".$row['id']);
    while ($row2=mysql_fetch_assoc($res2)) {
        echo $row2['subCatName']."<br>";
    }

}
Gruß hpvw

EDIT: PS: Du sprachst davon, noch Tabellen zusammen zu führen. Ich würde von jedem Eingriff in die Datenbankstruktur absehen, der eine Verletzung einer der ersten drei (evtl sogar 4) Normalformen zur Folge hat.
 
Zuletzt bearbeitet:
Zurück