Hallo! Ich programmiere seit zirka 4 Jahren an einer Suchmaschine und stehe kurz vor der Fertigstellung, was auch langsam Zeit wird.
Als ich grad mit meinem Volltextsuche-Table handtiere, der 20 Millionen Einträge hat, ist mir was aufgefallen. Wenn ich ein Suchwort eingebe und Enter drücke kommen die Ergebnisse wie ein Blitz auf den Bildschirm geschossen. Wenn ich aber den gesamten Index um dessen verknüpften Dokumente gruppiert durchlaufen lasse, dauert es verständlicher Weise recht lang. Darauf will ich auch gar nicht hinaus. Sondern, mir ist dabei aufgefallen, dass MySQL die Datensäte scheinbar erstmal in den Speicher lädt und dann ausgibt. Ich dachte immer, dass würde in einer Art streaming aus der DB erfolgen.
Beispiel:
$sql1 = $this-db->query(„select * from db1“);
while($row1 = $sql1->fetch_assoc())
{
$sql2 = $this-db->query("select * from db2 where id=’$row1[id]’ ");
while($row2 = $sql2->fetch_assoc())
{
$this->db->query("insert into db3 () values () ");
}
}
SQL1 lädt nicht, wie ich angenommen habe einen DS und übergibt diesen sofort an SQL2, damit dieser einen anderen DS aus der DB holen kann, sondern lädt scheinbar erstmal alle DS für SQL1 in den Speicher und übergibt dann alle Ausgaben an SQL2. Also, eigentlich müsste das völlig danaeben sein, oder?
Wie ich auf diesen Schmarren gekommen bin:
Wenn ich SQL1 mit Limit 100 Starte, werden die DS, die SQL2 verarbeitet mittels SQL3 in einen anderen Table gespeichert. Dass passiert unmittelbar nach dem Programmstart. Wenn ich aber das Limit weglasse und genau genommen 20 Mio. Einträge um 360.000 Dokumente gruppiert durchlaufen lasse, dauert es sehr lange, bis die ersten verarbeiteten DS durch SQL3 in der Datenbank gespeichert werden.
Das wäre so, als würde die Schallplatte erstmal vom Anfang bis Ende durchlaufen, bis der ersten Ton aus den Lautsprächern käme. Also, irgendwie habe ich grad 1000 Fragezeichen im Schädel.
Hoffe, von euch weiß jemand Rat.
Beste Grüße
Thor Duisenberg