Nein, ich habe keinen Index auf der Zahl gehabt, obwohl ich die in einer Spalte gespeichert habe und sie nicht erst zur Abfrage ermittle (schließlich wollte ich die Abfrage optimieren) aber ich werde es mit dem Index auf der Spalte mal probieren.
Zum Telefonbuch, ja würde ich (nachdem ich eine Spalte mit der Information gerade '0' oder ungerade '1' angelegt habe). Wenn nicht sicher ausgeschlossen werden kann, ob nach einem bestimmten Zeichen kein Name mehr kommt, muß ich den ganzen String bis zum Ende durchsuchen (bis zur ersten Zahl könnte klappen aber wie bringe ich das effektiv der Abfrage bei?), das wäre bei mir noch nicht mal nötig (der erste falsche Buchstabe reicht). Wie lange dauert es im Gegensatz dazu, eine 1 oder 0 zu vergleichen und somit ca. die Hälfte aller Texte auszuschließen? Sagen wir mal weniger.
Danke für die Links, ich fürchte nur, mein Englisch reicht nicht um alles entscheidende hinter den Links zu verstehen aber wie man logische Verknüpfungen kürzt hatte ich in der Schule, in der Lehre, in der FOS und noch mal im Studium (und da war ich besser als in Englisch

).
Das Testscript wollte ich eigentlich so wie so posten, falls es was daran auszusetzen gibt.
Hier die Datenschleuder:
Code: Alles auswählen
<?php
//Benötigte Dateien und Variablen von phpBB
define('IN_PHPBB', true);
$phpbb_root_path = './';
include($phpbb_root_path . 'extension.inc');
include($phpbb_root_path . 'common.'.$phpEx);
mysql_query("CREATE TABLE test_daten (
text TEXT,
zeichenzahl INT
);
");
$otext =''; //Testtext min. 250 Wörter
$otext = preg_replace( "/[^a-z ÖÜÄöüäß]/im", "", $otext );
$otext = preg_replace( "/ {2,}/m", " ", $otext );
for ($i = 1; $i <= 100; $i++){
for ($ii = 2; $ii <= 5; $ii++){
$text = explode(' ', $otext, $ii);
$otext = array_pop($text);
$text = implode(' ', $text);
//echo $text;
$zeichenzahl = strlen($text);
//echo $zeichenzahl;
$treffer_sql = "INSERT INTO test_daten (text,zeichenzahl) VALUES ('$text', '$zeichenzahl')";
mysql_query($treffer_sql);
}
}
?>
Ich habe es mit ein paar Tausend Wörter gefüttert.
Und hier der Tester:
Code: Alles auswählen
<?php
function zeit($tn, $ta, $zeit)
{
$ta_array = explode(' ', $ta);
$tn_array = explode(' ', $tn);
$ta = $ta_array[1] - $zeit + $ta_array[0];
$tn = $tn_array[1] - $zeit + $tn_array[0];
$t = $tn - $ta;
return $t;
}
$zeit = time();
//Benötigte Dateien und Variablen von phpBB
define('IN_PHPBB', true);
$phpbb_root_path = './';
include($phpbb_root_path . 'extension.inc');
include($phpbb_root_path . 'common.'.$phpEx);
$vtext = array('', '', '', '', '', '', '', '', '', '' ); //Mischung aus 10 Wortgruppen die verschieden gut vorkommen oder verschieden knapp nicht vorkommen
$t1 = microtime();
for ($i = 1; $i <= 100; $i++){
for ($ii = 0; $ii <= 9; $ii++){
$zeichenzahl = count($vtext[$ii]);
$text = $vtext[$ii];
$treffer_sql = "SELECT text FROM test_daten WHERE zeichenzahl = '$zeichenzahl' AND text = '$text'";
$treffer_result = mysql_query($treffer_sql);
while($treffer_row = mysql_fetch_array($treffer_result))
{
$treffer_text = $treffer_row[0]; //um zu sehen, ob überhaupt was trifft
}
}
}
$t2 = microtime();
$t3 = microtime();
for ($i = 1; $i <= 100; $i++){
for ($ii = 0; $ii <= 9; $ii++){
$zeichenzahl = count($vtext[$ii]);
$text = $vtext[$ii];
$treffer_sql = "SELECT text FROM test_daten WHERE text = '$text' AND zeichenzahl = '$zeichenzahl'";
$treffer_result = mysql_query($treffer_sql);
while($treffer_row = mysql_fetch_array($treffer_result))
{
echo $treffer_row[0].'<br>';
}
}
}
$t4 = microtime();
$t5 = microtime();
for ($i = 1; $i <= 100; $i++){
for ($ii = 0; $ii <= 9; $ii++){
$text = $vtext[$ii];
$treffer_sql = "SELECT text FROM test_daten WHERE text = '$text'";
$treffer_result = mysql_query($treffer_sql);
while($treffer_row = mysql_fetch_array($treffer_result))
{
echo $treffer_row[0].'<br>';
}
}
}
$t6 = microtime();
$t_xwitz1 = zeit($t2, $t1, $zeit);
$t_xwitz2 = zeit($t4, $t3, $zeit);
$t_philipp = zeit($t6, $t5, $zeit);
echo "Scriptzeit:<br>Xwitz (Zahl AND Text): $t_xwitz1<br>Xwitz (Text AND Zahl): $t_xwitz1<br>Philipp: $t_philipp"
?>
Edit: $zeit wird an Funktion zeit() übergeben
PS: Ich habe an manchen Stellen Optimizer schon um das 5-fache geschlagen (nur nicht in php oder sql) und wundere mich auch nicht, den der Optimizer kann nicht wissen was ich unter Umständen weiß und sagen kann ich es ihm in der Regel auch nicht. Ich verdiene z.Z. mein Geld mit prozessortaktgenauer Echtzeitprogrammierung (kein PC

) um so unbehaglicher sind mir Systeme bei denen ich nicht weiß was sie wie und wann machen. Ich bin aber kein Informatiker und gehe auch nicht mit dem Vorsatz an meine Hobbyprogrammiererei, ein aufs letzte durchoptimiertes script "abzuliefern".
PPS: Ich habe den Test lokal ausgeführt.