• User Attivo

    Creazione Graduatoria

    Ciao a tutti, devo creare le "Graduatorie" dei migliori tempi per ogni gara in base a ciò che vuole vedere l'utente...

    Qui potete vedere le relazioni del DB: http://www.lucandre.com/scambio/relazioniGraduatorie.pdf

    Io fin'ora ho utilizzato questo codice:
    [PHP]
    <?php
    $sql="SELECT codFinAtl,nome,cognome,YEAR(dataNascita) AS annoNascita, MIN(tempoRisultato) AS tempoRisultato, dataManifestazioneIn, sedeManifestazione, graduatorie.crono FROM manifestazionigrad INNER JOIN (anagrafica INNER JOIN graduatorie ON codFin=codFinAtl) ON manifestazionigrad.idManifestazione=graduatorie.codMan WHERE anagrafica.eliminato='n' AND graduatorie.eliminato='n' AND codGara='".$sub_gara."' AND sesso='".$_POST['sesso']."' AND manifestazionigrad.aa='".$ANNOAG."' AND graduatorie.baseVasca='".$_POST['cod_tipovasca']."'";
    if($nomeCat=="Seniores")
    $sql.=" AND YEAR(dataNascita)<='".$sub_anno."'";
    else{
    if($sub_anno==($anni[1]."-".$anni[2]."-".$anni[3]))
    $sql.=" AND (YEAR(dataNascita)='".$anni[1]."' OR YEAR(dataNascita)='".$anni[2]."' OR YEAR(dataNascita)='".$anni[3]."')";
    else{
    if($sub_anno!=($anni[1]."-".$anni[2]))
    $sql.=" AND YEAR(dataNascita)='".$sub_anno."'";
    elseif($sub_anno==($anni[1]."-".$anni[2]))
    $sql.=" AND (YEAR(dataNascita)='".$anni[1]."' OR YEAR(dataNascita)='".$anni[2]."')";
    }
    }
    $sql.=" GROUP BY codFinAtl ORDER BY tempoRisultato, cognome, nome";
    $ris=@mysql_query($sql);
    // echo $sql;
    if(mysql_num_rows($ris)>=1){
    ?>
    <table class="tborder" width="100%" cellspacing="1" cellpadding="6" border="0" align="center">
    <tr>
    <td class="thead" width="10">Pos.</td>
    <td class="thead" width="200">Atleta</td>
    <td class="thead" width="40">Anno</td>
    <td class="thead" width="60">Tempo</td>
    <td class="thead" width="240">Conseguimento</td>
    </tr>
    <?
    $i=1;
    while($riga=mysql_fetch_array($ris)){
    $cognome=strtoupper($riga['cognome']);
    $nome=ucwords($riga['nome']);
    $anno=$riga['annoNascita'];
    $codFinAtl=$riga['codFinAtl'];
    $sql2="SELECT tempoRisultato, dataManifestazioneIn, sedeManifestazione, graduatorie.crono FROM manifestazionigrad INNER JOIN graduatorie ON manifestazionigrad.idManifestazione=graduatorie.codMan WHERE graduatorie.eliminato='n' AND codGara='".$sub_gara."' AND manifestazionigrad.aa='".$ANNOAG."' AND graduatorie.baseVasca='".$_POST['cod_tipovasca']."' AND codFinAtl='".$codFinAtl."' ORDER BY tempoRisultato LIMIT 1";
    $ris2=@mysql_query($sql2);
    $riga1=mysql_fetch_array($ris2);
    $sede=strtoupper($riga1['sedeManifestazione']);
    $crono=$riga1['crono'];
    $tempo=$riga1['tempoRisultato'];
    $annoD=substr($riga1['dataManifestazioneIn'],0,4);
    $meseD=substr($riga1['dataManifestazioneIn'],5,2);
    $giornoD=substr($riga1['dataManifestazioneIn'],8,2);
    $data=$giornoD."/".$meseD."/".$annoD;
    if($crono=="M"){
    if($_POST['cod_tipovasca']==25)
    $tempo=$tempo + 20;
    elseif($_POST['cod_tipovasca']==50)
    $tempo=$tempo + 40;
    }elseif($crono=="A"){
    $tempo=$tempo;
    }
    $tempo=str_pad($tempo,6,'0',STR_PAD_LEFT);
    $tempoVis=(substr($tempo,0,2))."'".(substr($tempo,2,2)).".".(substr($tempo,4,2));
    //$data_fn=$giorno_fn."/".$mese_fn."/".$anno_fn;

    						//ControlloSocietàSiciliana
    						$annoAtleta=substr($ANNOAG,0,4);
    						$sqlSoc="SELECT codSoc FROM rel_atl_soc WHERE aa='".$annoAtleta."' AND codFin='".$codFinAtl."' AND tipoTess='PR'";
    						$risSoc=@mysql_query($sqlSoc);
    						if(mysql_num_rows($risSoc)<1){
    							$sqlSoc="SELECT codSoc FROM rel_atl_soc WHERE aa='".$annoAtleta."' AND codFin='".$codFinAtl."' AND tipoTess='TE'";
    							$risSoc=@mysql_query($sqlSoc);
    						}
    						$rigaSoc=mysql_fetch_array($risSoc);
    						$codSoc=$rigaSoc['codSoc'];
    						if(substr($codSoc,0,3)!="SIC")
    							continue;
    							
                    ?>
    

    [/PHP]

    E' sempre andato tutto bene, ma ora improvvisamente l'estrapolazione dei dati è diventato sempre più lento e la maggior parte delle volte il DB va in Time Out non riuscendo a completare il caricamento della pagina.

    Nelle relazioni che vedete, i campi "codFin", "codFinAtl", "codManifestazione", "codSoc", sono campi UNIVOCI...

    Mi aiutate a risolvere il problema per favore?


  • ModSenior

    Ciao talkoman,
    hai inserito in tutte le tabelle gli indici?
    Di quanti dati stiamo parlando?


  • User Attivo

    Si, gli indici sono presenti in ogni tabella....beh, i dati da estrarre sono parecchi....


  • ModSenior

    Parecchi quanto? Serve un dato oggettivo...


  • User Attivo

    Beh i dati da estrarre, che alla fine sono visibili non sono quasi mai più di 100....ma nella tabella Anagrafica deve cercare tra 60.524 dati, e nella tabella "rel_atl_soc" ci sono 84.436 dati...


  • User Attivo

    Nessun suggerimento?


  • User Attivo

    I numeri vi hanno fatto paura?


  • ModSenior

    Le query non sono molto complesse, e nemmeno il numero di dati mi sembra molto elevato da giustificare questo problema.
    Intanto ti dire di fare un explain della query, inoltre se puoi posta la struttura vista con phpmyadmin delle tabelle interessate, perchè l'utilizzo degli indici non mi convince.


  • User Attivo

    @Thedarkita said:

    ...Intanto ti dire di fare un explain della query, inoltre se puoi posta la struttura vista con phpmyadmin delle tabelle interessate, perchè l'utilizzo degli indici non mi convince.

    Come si fa?


  • ModSenior

    Aggiungi EXPLAIN EXTENDED all'inizio della query e la lanci da phpmyadmin.


  • User Attivo

    Ecco il risultato:

    Risultato SQL
    
    Host: *******
    Database: *******
    Generato il: 14 apr, 2011 at 01:25 PM
    Generato da: phpMyAdmin 3.2.0.1 / MySQL 5.0.91-enterprise-gpl-log
    query SQL: EXPLAIN EXTENDED SELECT codFinAtl,nome,cognome,YEAR(dataNascita) AS annoNascita, MIN(tempoRisultato) AS tempoRisultato, dataManifestazioneIn, sedeManifestazione, graduatorie.crono FROM manifestazionigrad INNER JOIN (anagrafica INNER JOIN graduatorie ON codFin=codFinAtl) ON manifestazionigrad.codice=graduatorie.codMan WHERE anagrafica.eliminato='n' AND graduatorie.eliminato='n' AND codGara='01' AND sesso='M' AND manifestazionigrad.aa='2010/11' AND graduatorie.baseVasca='25' AND (YEAR(dataNascita)='1991' OR YEAR(dataNascita)='1992') GROUP BY codFinAtl ORDER BY tempoRisultato, cognome, nome; 
    Righe: 3
    
    id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
    1	SIMPLE	manifestazionigrad	ALL	NULL	NULL	NULL	NULL	129	Using where; Using temporary; Using filesort
    1	SIMPLE	graduatorie	ALL	NULL	NULL	NULL	NULL	56788	Using where
    1	SIMPLE	anagrafica	ALL	NULL	NULL	NULL	NULL	60493	Using where