50 000 enregistrements avec PHP MySql, extremement lent
Posté : 13 avr. 2006, 02:18
Bonjour et merci à ceux et celles qui prennent du temps pour mon problème.
Mon problème:
Temps de recherche allant jusqu'à plusieurs minutes, et donnant parfois un message d'erreur
J'utilise de nombreuses requêtes du genre
Ici je filtre 40 000 enregistrements du fichier adress et 50 000 enregistrements du fichier adtel et c'est extremement long, j'ai aussi utilisé les USE INDEX mais ce n'est pas plus performant.
Le fichier address contient l'adresse géographique et le nom de la société, le fichier adtel contient tous les contacts, (maintenant il ne contient plus les téléphones), donc une infinité de contacts par adresse.
De plus le fichier adtelfax contient tous les numéros de téléphone et fax, avec une infinité de téléphones par contact. Dans adtelfax j'ai beaucoup amélioré la rapidité en comprimant le numéro de téléphone systèmatiquement un champ du genre: 01 45 23 34 54 devient 0145233454, ou encore en Amérique du Nord (622) 754-5678 devient 6227545678. Donc un strpos est très rapide.
Par contre dans le script précédent le temps de recherche est très long, et assez souvent il y a un dépassement de temps qui montre un message d'erreur.
Merci encore pour votre aide.
Mon problème:
Temps de recherche allant jusqu'à plusieurs minutes, et donnant parfois un message d'erreur
J'utilise de nombreuses requêtes du genre
<?php
session_start();
if ($v_adr_id0 == '') {$v_adr_id0=$adr_id;} else {$adr_id=$v_adr_id0;}
if ($v_adp_id0 == '') {$v_adp_id0=$adp_id;} else {$adp_id=$v_adp_id0;}
//echo "line 6 edit0 $edit0 v_edit0 $v_edit0<br>";
$v_edit0=$edit0;
if ($name0 != '' ) {
$name0 = strtoupper($name0);
if (strpos($name0,' ')>0) {$name0 = substr($name0,0,strpos($name0,' '));}
if (strpos($name0,',')>0) {$name0 = substr($name0,0,(strpos($name0,' ')-1));}
if (strlen($name0) > 10) {$name0 = substr($name0,0,10);}
}
//echo "line 9 edit0 $edit0 v_edit0 $v_edit0<br>";
//echo "adr_id $adr_id v_adr_id0 $v_adr_id0 adp_id $adp_id v_adp_id0 $v_adp_id0<br>";
?>
<html>
<head>
<title>Name search Business Dashboard</title>
</head>
<body link="blue" alink="blue" vlink="blue">
<?php
echo "<table>";
echo "<tr>";
echo "<td bgcolor=silver align=left valign=top><img src=\"images_CRM/dbd_120.gif\" width=\"128\" height=\"79\" alt=\"Business Dashboard\"></td>\n";
echo "<td align=center bgcolor=\"#66FF99\"><font face=Arial size=3>BUSINESS<br>DASHBOARD</font><br><b><font face=Arial color=\"#FFFFFF\" size=2>Management</font></b><td>";
?>
<form method="post" action="<?php echo $PHP_SELF?>">
<input type="Text" name="name0" size="20" value="">
<input type="Submit" name="submit" value="Search this name">
</form>
<?php
echo "</table>";
if ($name0 !='') {
echo "<table border=1>";
echo "<tr><td align=center colspan=2><font face=Arial size=4>Search for $name0";
include "../include/get_root_da_erp.inc";
echo "<tr><td valign=top><table border=0><tr><td colspan=2 align=center><font face=Arial size=3>Searching in Addresses";
$result = mysql_query ("SELECT * FROM address",$db);
while ($myrow = mysql_fetch_array($result)) {
$v_descr1 = strtoupper('@'.$myrow["adr_name1"]);
$v_descr2 = strtoupper('@'.$myrow["adr_name2"]);
if ( strpos($v_descr1,$name0) > 0 || strpos($v_descr2,$name0) > 0 ) {
$v_name1_10 = substr($myrow["adr_name1"],0,10);
printf("<tr><td><font size=1>%s</font><td><a href=\"address.php?search_10=$v_name1_10\"><font size=2>%s %s</font></a>\n", $myrow["adr_id"], $myrow["adr_name1"], $myrow["adr_name2"]);
}
}
echo "</table></td><td valign=top>";
echo "<table border=0><tr><td colspan=3 align=center><font face=Arial size=3>Searching in Contacts";
$resultct = mysql_query ("SELECT * FROM adtel",$db);
while ($myrowct = mysql_fetch_array($resultct)) {
$v_descr3 = strtoupper('@'.$myrowct["adt_first"]);
$v_descr3sp = strpos($v_descr3,$name0);
$v_descr4 = strtoupper('@'.$myrowct["adt_last"]);
$v_descr4sp = strpos($v_descr4,$name0);
$v_descr5 = strtoupper('@'.$myrowct["adt_email"]);
$v_descr5sp = strpos($v_descr5,$name0);
$v_descr6 = strtoupper('@'.$myrowct["adt_url"]);
$v_descr6sp = strpos($v_descr6,$name0);
if ( $v_descr3sp > 0 || $v_descr4sp > 0 || $v_descr5sp > 0 || $v_descr6sp > 0) {
$v_adr_id10 = $myrowct["adt_adr_id"];
if ( $myrowct["adt_adr_id"] != 0 ) {
$resultad2 = mysql_query ("SELECT * FROM address WHERE adr_id=$v_adr_id10",$db);
while ($myrowad2 = mysql_fetch_array($resultad2)) {
$v_name_1_2 = $myrowad2["adr_name1"].' '.$myrowad2["adr_name2"]; }
$search_10 = strtoupper($v_name_1_2);
if (strpos($search_10,' ')>0) {$search_10 = substr($search_10,0,strpos($search_10,' '));}
if (strpos($search_10,',')>0) {$search_10 = substr($search_10,0,(strpos($search_10,' ')-1));}
if (strlen($search_10) > 10) {$search_10 = substr($search_10,0,10);}
$v_search_10 = $search_10;
printf("<tr><td><font size=1>%s</font><td><a href=\"address.php?search_10=$v_search_10\"><font size=2>%s</font></a><td>.</font>\n", $myrowct["adt_adr_id"], $v_name_1_2);
//printf("<tr><td><font size=1>%s</font><td><font size=2>%s %s %s %s</font><td><font size=2>%s %s %s %s</font>\n", $myrowct["adt_adr_id"], $v_descr3sp, $v_descr3, $v_descr4sp, $v_descr4, $v_descr5sp, $v_descr5, $v_descr6sp, $v_descr6);
} else {
$v_name_1_2_3 = $myrowct["adt_first"].' '.$myrowct["adt_last"];
printf("<tr><td><font size=1>%s</font><td><a href=\"contact.php?\"><font size=2>%s</font></a><td><font size=2>%s %s</font>\n", $myrowct["adt_adr_id"], $v_name_1_2_3, $myrowct["adt_email"], $myrowct["adt_url"]);
}
}
}
echo "</table>";
echo "</table><br><br><a href=\"address.php\"><font size=4>New Address</font></a>";
}
?>
</body>
Ici je filtre 40 000 enregistrements du fichier adress et 50 000 enregistrements du fichier adtel et c'est extremement long, j'ai aussi utilisé les USE INDEX mais ce n'est pas plus performant.
Le fichier address contient l'adresse géographique et le nom de la société, le fichier adtel contient tous les contacts, (maintenant il ne contient plus les téléphones), donc une infinité de contacts par adresse.
De plus le fichier adtelfax contient tous les numéros de téléphone et fax, avec une infinité de téléphones par contact. Dans adtelfax j'ai beaucoup amélioré la rapidité en comprimant le numéro de téléphone systèmatiquement un champ du genre: 01 45 23 34 54 devient 0145233454, ou encore en Amérique du Nord (622) 754-5678 devient 6227545678. Donc un strpos est très rapide.
Par contre dans le script précédent le temps de recherche est très long, et assez souvent il y a un dépassement de temps qui montre un message d'erreur.
Merci encore pour votre aide.