fgr Skrevet 19. september 2009 Del Skrevet 19. september 2009 (endret) Heisann. Jeg har en parser som har henta odds og resultater og lagt det inn i en database. Du kan se outputen her: http://avisavis.no/odds2/les.php Jeg vil lage en php-loop som går igjennom alle mulige oddskombinasjoner, men hjernen min strekker ikke helt til for å lage dette smart nok Det loopen skal gjøre er å printe ut alle odds-kombinasjoner som gir mer enn 110% total profitt og som har mer enn 300 kamper som grunnlag. Jeg begynte på den, men det ble bare rot. http://avisavis.no/odds2/calculate.php Og her er bilde av tabellen: http://img185.imageshack.us/img185/3807/testc.png <html> <style type="text/css"> <!-- body { font-family:Tahoma,Arial,sans-serif; font-size:92%; } table { border-collapse:collapse; empty-cells:show; font-family:Tahoma,Arial,sans-serif; font-size:92%; } .result-ok { background-color:#80B62A; color:white; } .odd { background-color: #FFFFFF; } .even { background-color:#F2F2F2;; } --> </style> Denne saken printer ut alle oddskombinasjoner der du går mer enn 110% i pluss og det er mer enn 300 kamper som grunnlag. <?php set_time_limit(7000); mysql_connect("localhost", "", "") or die(mysql_error()); mysql_select_db("avisaphk_avis") or die(mysql_error()); $tegn = 0; while ( $tegn <= 2 ) { $tegn++; if ( $tegn == 1 ) { $tegnet = ">"; } if ( $tegn == 2 ) { $tegnet = "<"; } $nummer = 0; while ( $nummer <= 4 ) { $nummer++; $number = 1; while ( $number <= 3 ) { if ( $number == 1 ) { $hvem_odds = H; } if ( $number == 2 ) { $hvem_odds = U; } if ( $number == 3 ) { $hvem_odds = B; } $number++; $num = 1; while ( $num <=10 ) { if ( $nummer == 1 ) { } if ( $nummer == 2 ) { if ( $numb <= 0 ) {$numb = 10; } $numb = ( $numb - 0.05 ); $add = "AND H <= $numb"; } if ( $nummer == 3 ) { if ( $numb <= 0 ) {$numb = 10; } $numb = ( $numb - 0.05 ); $add = "AND U <= $numb"; } if ( $nummer == 4 ) { if ( $numb <= 0 ) {$numb = 10; } $numb = ( $numb - 0.05 ); $add = "AND B <= $numb"; } $sql = mysql_query("SELECT * from ny_odds WHERE $hvem_odds $tegnet= $num $add"); // finn ut hvor mange resultater while($hallo = mysql_fetch_array($sql)) { $totalt_antall_kamper++; if ( $hallo[hjemmescore] > $hallo[bortescore] ) { $hjemmeseier_count++; $Hgevinst = $Hgevinst + ( $hallo[H] * 10 ); } if ( $hallo[hjemmescore] == $hallo[bortescore] ) { $uavgjort_count++; $Ugevinst = $Ugevinst + ( $hallo[U] * 10 ); } if ( $hallo[hjemmescore] < $hallo[bortescore] ) { $borteseier_count++; $Bgevinst = $Bgevinst + ( $hallo[B] * 10 ); } } $innsats = ( $totalt_antall_kamper * 10 ); $total_H_gevinst = ( $Hgevinst - $innsats); $total_U_gevinst = ( $Ugevinst - $innsats ); $total_B_gevinst = ( $Bgevinst - $innsats ); //echo "<br>\n [SELECT * from ny_odds WHERE $hvem_odds >= $num $add]."; if ( $total_H_gevinst > 0 or $total_U_gevinst > 0 or $total_B_gevinst > 0 ) { if ( $totalt_antall_kamper > 300 ) { if ( $total_H_gevinst > 0 and ( ( $Hgevinst / $innsats ) * 100 ) > 110 ) { echo "<br>\n [SELECT * from ny_odds WHERE $hvem_odds $tegnet= $num $add]."; echo "$totalt_antall_kamper antall kamper, innsats: $innsats"; echo ", HGEVINST: $total_H_gevinst (+". ( ( $Hgevinst / $innsats ) * 100 ). "%)"; } if ( $total_U_gevinst > 0 and ( ( $Ugevinst / $innsats ) * 100 ) > 110 ) { echo "<br>\n [SELECT * from ny_odds WHERE $hvem_odds $tegnet= $num $add]."; echo "$totalt_antall_kamper antall kamper, innsats: $innsats"; echo ", UGEVINST: $total_U_gevinst (+". ( ( $Ugevinst / $innsats ) * 100 ). "%)"; } if ( $total_B_gevinst > 0 and ( ( $Bgevinst / $innsats ) * 100 ) > 110 ) { echo "<br>\n [SELECT * from ny_odds WHERE $hvem_odds $tegnet= $num $add]."; echo "$totalt_antall_kamper antall kamper, innsats: $innsats"; echo ", BGEVINST: $total_B_gevinst (+". ( ( $Bgevinst / $innsats ) * 100 ). "%)"; } } } unset($totalt_antall_kamper); unset($hjemmeseier_count); unset($uavgjort_count); unset($borteseier_count); unset($Hgevinst); unset($Ugevinst); unset($Bgevinst); $num = ($num + 0.05); } } } } Endret 19. september 2009 av jagarock Lenke til kommentar
Ernie Skrevet 20. september 2009 Del Skrevet 20. september 2009 Jeg tror du bør gjøre koden langt mer leselig hvis du ønsker hjelp. Akkurat nå har du en rekke linjer som rett og slett er direkte uleselige. God kode er lesbar, ikke så kort som overhode mulig. Dessuten er det litt vanskelig å vite hva du skal frem til med koden. Hva innebærer «går igjennom alle mulige oddskombinasjoner», og hva er problemet med koden du allerede har? Hva gjør den riktig, og hva gjør den galt? Et generelt tips: Det finnes noe som heter elseif. Den vil utføre kode hvis if er false og uttrykket i elseif er true. Dvs. i stedet for if ( $tegn == 1 ) { $tegnet = ">"; } if ( $tegn == 2 ) { $tegnet = "<"; } kan man skrive if ( $tegn == 1 ) { $tegnet = ">"; } elseif ( $tegn == 2 ) { $tegnet = "<"; } fordi begge deler ikke kan inntreffe samtidig. PS: Hvis koden du allerede har mot formodning gjør ting riktig, men bare er for treg: Har du lagt til indekser for H+U, H+B, U+H, U+B, B+H og B+U? Lenke til kommentar
fgr Skrevet 20. september 2009 Forfatter Del Skrevet 20. september 2009 (endret) jeg kan ikke noe om optimalisering av mysql tabeller. nå er nesten alt satt til varchar. problemet med koden min er at den er for treg. jeg har lagd en ny versjon og under følger en del av den. denne delen tar ca. en time å kjøre det hele scriptet tilslutt skal gjøre er å gå igjennom alle oddskombinasjoner som sagt. fks. H odds skal være 1-15, sammen med B odds 1-15. (eks. i rekka vil bli H odds er mer enn 4.55 og B odds mindre enn 8.30) og den må da loope igjennom H/U/B for å lage alle mulige kombinasjoner. $num = 0.95; $num2 = 15; while ( $num2 >= 0 ) { $num = 0.95; while ( $num <=15 ) { $num = ($num + 0.05); $sql = mysql_query("SELECT * from ny_odds WHERE H >= $num AND H <= $num2"); // hvis det er mindre enn 300 resultater, skip. if ( mysql_num_rows($sql) < 300 ) { continue; } // hvis ikke, kjør igjennom denna. while($hallo = mysql_fetch_array($sql)) { $totalt_antall_kamper++; if ( $hallo[hjemmescore] > $hallo[bortescore] ) { $hjemmeseier_count++; $Hgevinst = $Hgevinst + ( $hallo[H] * 10 ); } if ( $hallo[hjemmescore] == $hallo[bortescore] ) { $uavgjort_count++; $Ugevinst = $Ugevinst + ( $hallo[U] * 10 ); } if ( $hallo[hjemmescore] < $hallo[bortescore] ) { $borteseier_count++; $Bgevinst = $Bgevinst + ( $hallo[B] * 10 ); } } $innsats = ( $totalt_antall_kamper * 10 ); $total_H_gevinst = ( $Hgevinst - $innsats); $total_U_gevinst = ( $Ugevinst - $innsats ); $total_B_gevinst = ( $Bgevinst - $innsats ); if ( $total_H_gevinst > 0 or $total_U_gevinst > 0 or $total_B_gevinst > 0 ) { if ( $total_H_gevinst > 0 and ( ( $Hgevinst / $innsats ) * 100 ) > 110 ) { print "<br>\n [SELECT * from ny_odds WHERE H >= $num AND H <= $num2]. $totalt_antall_kamper antall kamper, innsats: $innsats. HGEVINST: $total_H_gevinst (+". ( ( $Hgevinst / $innsats ) * 100 ). "%)"; } if ( $total_U_gevinst > 0 and ( ( $Ugevinst / $innsats ) * 100 ) > 110 ) { print "<br>\n [SELECT * from ny_odds WHERE H >= $num AND H <= $num2]. $totalt_antall_kamper antall kamper, innsats: $innsats. UGEVINST: $total_U_gevinst (+". ( ( $Ugevinst / $innsats ) * 100 ). "%)"; } if ( $total_B_gevinst > 0 and ( ( $Bgevinst / $innsats ) * 100 ) > 110 ) { print "<br>\n [SELECT * from ny_odds WHERE H >= $num AND H <= $num2]. $totalt_antall_kamper antall kamper, innsats: $innsats. BGEVINST: $total_B_gevinst (+". ( ( $Bgevinst / $innsats ) * 100 ). "%)"; } } unset($totalt_antall_kamper); unset($hjemmeseier_count); unset($uavgjort_count); unset($borteseier_count); unset($Hgevinst); unset($Ugevinst); unset($Bgevinst); } $num2 = ($num2 - 0.05); } Endret 20. september 2009 av jagarock Lenke til kommentar
Ernie Skrevet 20. september 2009 Del Skrevet 20. september 2009 Vel, hvis koden fungerer som den skal og bare er for treg så er det nok bare å legge til indekser og konvertere feltene vekk fra varchar der det er mulig. Hvis jeg tolker ting riktig så har du ca 20k rader, og det skal isåfall ikke være i nærheten av å være så tregt hvis du faktisk indekserer tabellen korrekt. Som sagt, lag kombinerte indekser for H og U, H og B, U og H, U og B, B og H; og B og U. Indeks for H, B og U alene vil være unødvendig pga. de kombinerte indeksene (MySQL henter det ut fra en av de). Lenke til kommentar
fgr Skrevet 20. september 2009 Forfatter Del Skrevet 20. september 2009 (endret) jeg skjønner ikke helt hva du mener med de kombinerte indeksene hvorfor ikke bare indeksere H , U og B? jeg la nå akkurat til H, U, B, hjemmeseier og borteseier som indekser, og jeg ser hastigheten er mye bedre nå, men fortsatt ikke helt der jeg vil ha det.. jeg la til en progressbar, og den går med 1% på 30sek. så det vil si at den bruker fortsatt 50 minutter, og det bare på å kjøre min H vs max H.. http://avisavis.no/odds2/calc.php jeg har lest meg opp på datatyper nå og tror jeg har fått til greit: Endret 20. september 2009 av jagarock Lenke til kommentar
Ernie Skrevet 20. september 2009 Del Skrevet 20. september 2009 Grunnen til at du trenger en indeks over flere felt er fordi MySQL bare velger en indeks pr. spørring, og du har spørringer som benytter flere felter. Det du må gjøre er å lage en indeks på 2 felter/kolonner («Lag indeks på [ ] kolonner» under struktur i phpmyadmin) og velge H og U, H og B, U og H, U og B, B og H; og B og U. Det vil altså gi 6 indekser hver over 2 felter. Indekser for H, U og B alene vil være overflødig side MySQL kan hente ut f.eks H fra indeksen på H og U kombinert. Lenke til kommentar
fgr Skrevet 20. september 2009 Forfatter Del Skrevet 20. september 2009 det går fortsatt like sakte her, 30 sek. det er på en H < > H spørring.. $sql = mysql_query("SELECT * from ny_odds WHERE H >= $num AND H <= $num2"); Lenke til kommentar
PlastBox Skrevet 13. oktober 2009 Del Skrevet 13. oktober 2009 (endret) Vet ikke om denne er løst eller ikke men jeg vil anbefale bruk av echo 'Tid: '.(microtime(true) - $ts).'<br />'; (float)$ts = microtime(true); flere steder i koden din for å se hvilke biter som tar lengst tid og hva du må optimalisere. En MySQL-tabell med lusne 20.000 rader skal ikke trenge noen avansert indeksering utenom det vanlige primærnøkkel/index feltet for å returnere resultatet i løpet av millisekunder. For å virkelig utelukke hvorvidt problemet faktisk er MySQL kan du gjøre om tabellen din til MEMORY fremfor InnoDB eller hva nå enn du bruker til vanlig. Med memory-tabeller jobber MySQL mot maskinens RAM og klarer fin-fint en spørring mot et hundretusentalls rader så raskt at du ikke vil merke noen forsinkelse. Beware though, MEMORY-tabeller er som RAM-disker. Forsvinner strømmen (eller databasemotoren), så forsvinner innholdet! Endret 13. oktober 2009 av PlastBox Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå