Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
LiivaneLord
Sõpradele "Olavi"
liitunud: 20.06.2006
|
17.11.2012 21:16:25
Leht laeb aeglaselt väga suure tabeli tõttu |
|
|
http://liivanelord.planet.ee/viking/?1=6&2=2&3=34&4=11&5=45&6=46&7=47&8=9&9=14&10=16&11=5&tabel=on&sagedus=1&vt=Vaata
See tabel täispikana laeb väga aeglaselt, vähemalt 10 sekundit kulub enne, kui kogu leht on laetud. Selle vältimiseks võtsin kasutusele vaikimisi piiratud tabeli suuruse näitamise, kuid kas kogu tabelit annaks kuidagi kuvada nii, et see oleks väiksem koormus serverile ja kasutaja arvutile ning avaneks kiiremini?
See on loodud puhtalt tabeli põhjal, andmed on andmebaasis kujul loosimise number, I, II, III, IV, V, VI, lisa1, lisa2, õnnenumber + tabamuste väärtused.
Kood on pikk, aga lühidalt kokkuvõttes tulevad andmebaasist andmed kujul $andmed_numbrid[nr]. Kui $andmed_numbrid[nr] kattub pileti numbriga, siis number on punane või roheline. Sedasi iga numbri kohta. Sedasi iga ühtivuse korral suureneb põhinumbrite või lisanumbrite hulk ning vastavalt sellele valitakse andmebaasi teisest (süsteemi)tabelist õige vastavate tabamuste hulk valitud numbrite hulga kohta, korrutatakse see numbrite tabelis kirja pandud tabamuste väärtustega läbi ja sellest kujuneb võidusumma.
See toimub kogu tabeli ulatuses, vaatamata sellele, kas tabel on avatud täielikult või osaliselt. Aga kui tabel on avatud osaliselt (100 viimast loosimist), siis avaneb tabel alla 3 sekundiga.
On võimalik midagi muuta või asjale teisiti läheneda? Kood ise, mis tabeli loob, on lühidalt:
php:
|
echo "<tr><td>". $andmed_numbrid[nr ]. "</td><td". $stiil[I ]. ">". $andmed_numbrid[I ]. "</td><td". $stiil[II ]. ">". $andmed_numbrid[II ]. "</td><td". $stiil[III ]. ">". $andmed_numbrid[III ]. "</td><td". $stiil[IV ]. ">". $andmed_numbrid[IV ]. "</td><td". $stiil[V ]. ">". $andmed_numbrid[V ]. "</td><td". $stiil[VI ]. ">". $andmed_numbrid[VI ]. "</td><td></td><td". $stiil[lisa1 ]. ">". $andmed_numbrid[lisa1 ]. "</td><td". $stiil[lisa2 ]. ">". $andmed_numbrid[lisa2 ]. "</td><td></td><td>". $andmed_numbrid[onnenumber ]. "</td><td style='width:20px'>". $nool. "</td><td>". $tabamus. "</td><td>". $voit. "</td></tr>";
|
|
|
Kommentaarid: 20 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
19 |
|
tagasi üles |
|
 |
spreiii
HV kasutaja
liitunud: 27.12.2008
|
17.11.2012 22:55:17
|
|
|
Ilmselt on siinkohal probleemiks just vastav SQL kood või siis meetod kuidas neid andmeid hiljem (loop'is) töödeldakse.
|
|
Kommentaarid: 23 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
23 |
|
tagasi üles |
|
 |
andrusny
Kreisi kasutaja

liitunud: 20.03.2006
|
17.11.2012 23:12:37
|
|
|
Kui ridu tuleb üle saja-kahesaja, siis peaksid tulemuse vist ikkagi lehekülgedeks jaotama. See teeks ju lehekülje mõttetult pikaks, kel vaja, kül see õige lehekülje avaks. Mitmest reast üldse jutt käiks?
_________________
 |
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
LiivaneLord
Sõpradele "Olavi"
liitunud: 20.06.2006
|
18.11.2012 00:37:02
|
|
|
andrusny, tiba üle 1000 rea. Peab vist lehekülgede peale mõtlema jah.
php:
|
$sql_numbrid= mysql_query("select * from $viking order by nr DESC");
|
Proovisin veel nii, et võtsin lehe lähtekoodi (mis on krdima pikk) ja salvestasin selle failisse ja laadisin üles. See laadis isegi veel kauem.
|
|
Kommentaarid: 20 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
19 |
|
tagasi üles |
|
 |
p2tu
HV kasutaja

liitunud: 06.11.2001
|
18.11.2012 01:05:31
|
|
|
No 1000 rida html'is laebki aeglaselt. Siin oleks ainuke lahendis mingi preload jqueryga vms. Lihtsam on sul teha lehed 100 kaupa.
|
|
Kommentaarid: 24 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
24 |
|
tagasi üles |
|
 |
2ndalpha
HV kasutaja

liitunud: 03.11.2004
|
18.11.2012 01:27:56
|
|
|
Ega Sa mingeid stiile jQueryga külge ei pane. Nii suure DOM puu läbikäimine võtab kaua aega.
Igasugu muude spekulatsioonide vältimiseks soovitan vaadata mille peale täpsemalt aeg kulub: http://tools.pingdom.com/fpt/
|
|
Kommentaarid: 23 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
22 |
|
tagasi üles |
|
 |
LiivaneLord
Sõpradele "Olavi"
liitunud: 20.06.2006
|
18.11.2012 01:31:38
|
|
|
p2tu, ok, teen siis mitu lehte.
|
|
Kommentaarid: 20 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
19 |
|
tagasi üles |
|
 |
mikk150
HV kasutaja
liitunud: 04.05.2006
|
18.11.2012 16:21:41
|
|
|
p6hjus miks kaua laeb on andmete k2ttesaamine aeglastelt hdd delt. midagi sinna teha ei saa. olen ise ka staatilist tabelit genereerinud, kuna nii on kiirem
|
|
Kommentaarid: 3 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
3 |
|
tagasi üles |
|
 |
2ndalpha
HV kasutaja

liitunud: 03.11.2004
|
18.11.2012 16:36:17
|
|
|
mikk150 kirjutas: |
p6hjus miks kaua laeb on andmete k2ttesaamine aeglastelt hdd delt. midagi sinna teha ei saa. olen ise ka staatilist tabelit genereerinud, kuna nii on kiirem |
Kust Sa sellisele järeldusele jõudsid?
Baas võib kõiki kirjeid ka mälus hoida. 1000 kirjet nüüd küll mingi eriline andmehulk ei ole.
|
|
Kommentaarid: 23 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
22 |
|
tagasi üles |
|
 |
LiivaneLord
Sõpradele "Olavi"
liitunud: 20.06.2006
|
18.11.2012 18:42:01
|
|
|
mikk150, eks mul see loop on ka üsna mahukas. Andmed tuleb andmebaasist võtta, kõiki numbreid võrrelda kasutaja poolt sisestatud numbritega, võrrelda seda hulka andmebaasi teise tabeliga, leida tabamus ja võidusumma. Vastavalt sellele luua tabel. Vaatan koodi ka täpsemalt üle, kuidas seda lühendada, kuna praegusel juhul on liiga palju ebavajalikku CSS-i, mis on by default brauseri poolt valitud.
Kui kasutada veel tabeli värviliselt kuvamist, siis on asi eriti hull. Korra tuli isegi planet.ee poolt teade, et mingi limiit on ületatud ja pean maksma lisa ning leht on blokeeritud. Rohkem pole õnneks tulnud ja leht ikkagi avanes uue refreshiga.
|
|
Kommentaarid: 20 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
19 |
|
tagasi üles |
|
 |
spreiii
HV kasutaja
liitunud: 27.12.2008
|
18.11.2012 19:00:38
|
|
|
Ehk oleks võimalik sobivad vastused juba ühes SQL Query's kätte saada, et ei peaks näiteks iga rea korral uuesti andmebaasist midagi küsima (juhul kui hetkel nii on)?
|
|
Kommentaarid: 23 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
23 |
|
tagasi üles |
|
 |
LiivaneLord
Sõpradele "Olavi"
liitunud: 20.06.2006
|
18.11.2012 19:24:53
|
|
|
spreiii kirjutas: |
Ehk oleks võimalik sobivad vastused juba ühes SQL Query's kätte saada, et ei peaks näiteks iga rea korral uuesti andmebaasist midagi küsima (juhul kui hetkel nii on)? |
Toon lühidalt välja koodi, mis tabeli loob:
php:
|
$sql_numbrid= mysql_query("select * from $viking order by nr DESC limit $_GET[nt]"); if(in_array($andmed_numbrid[$väärtus ], $array_numbritest)){ if($väärtus=="lisa1" or $väärtus=="lisa2"){ $värv="green"; $y=$y+1; } else{ $värv="red"; $x=$x+1; } $andmed_numbrid[$väärtus]="<span style='color:$värv$joon'>$andmed_numbrid[$väärtus]</span>"; $stiil[$väärtus]=" style='height:18px;width:18px;border:2px solid $värv;$p'"; } else{ $andmed_numbrid[$väärtus]="<span style='font-weight:normal$joon'>$andmed_numbrid[$väärtus]</span>"; $stiil[$väärtus]=" style='height:18px;width:18px;border:2px solid $prgb;$p'"; } if($v_puudub==1){ $voit="<span style='color:blue;text-decoration:line-through;cursor:help' title='Sisaldab".$v_t_51.$v_t_5.$v_t_4.$v_t_3.$v_t_21." See summa arvutatakse kõiki neid tabamusi arvestades, kuid mahakriipsustatud võidunumbrid ei ole täpsed, kuna mul pole nende kohta andmeid. Aga see annab umbmäärase summa, palju see pilet võitis. Summa arvutamisel lähtutakse viimastest tabamuste väärtusest, mis on välja toodud sellest tabelist paremal ülal asuvas väikeses tabelis.'>".$voidusumma." €</span>"; } else{ $voit="<span style='color:blue;cursor:help' title='Sisaldab".$v_t_51.$v_t_5.$v_t_4.$v_t_3.$v_t_21." See summa arvutatakse kõiki neid tabamusi arvestades.'>".$voidusumma." €</span>"; } if($x>1){ $tabamus=""; } else{ $tabamus="<span style='color:green'>$x</span>"; $nool=">"; } if( $x==2 && $y>0 or $x==5 && $y>0){ $y=1; $tabamus="<span style='color:green'>$x+$y</span>"; $nool=">"; } if($x==6 && $z>0){$tabamus="<span style='color:green'>$x+</span>"; $nool=">"; } echo "<tr><td>". $andmed_numbrid[nr ]. "</td><td". $stiil[I ]. ">". $andmed_numbrid[I ]. "</td><td". $stiil[II ]. ">". $andmed_numbrid[II ]. "</td><td". $stiil[III ]. ">". $andmed_numbrid[III ]. "</td><td". $stiil[IV ]. ">". $andmed_numbrid[IV ]. "</td><td". $stiil[V ]. ">". $andmed_numbrid[V ]. "</td><td". $stiil[VI ]. ">". $andmed_numbrid[VI ]. "</td><td></td><td". $stiil[lisa1 ]. ">". $andmed_numbrid[lisa1 ]. "</td><td". $stiil[lisa2 ]. ">". $andmed_numbrid[lisa2 ]. "</td><td></td><td>". $andmed_numbrid[onnenumber ]. "</td><td style='width:20px'>". $nool. "</td><td>". $tabamus. "</td><td>". $voit. "</td></tr>"; }
|
Ärge siis näkku lööge, kui midagi on totaalselt valesti tehtud. Hobi mõttes olen progenud.
Aga praegusel juhul võetakse kõik andmed andmebaasist korraga?
EDIT: mikk150, pilt su allkirjas venib.
|
|
Kommentaarid: 20 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
19 |
|
tagasi üles |
|
 |
spreiii
HV kasutaja
liitunud: 27.12.2008
|
18.11.2012 19:39:14
|
|
|
Uurin veel koodi, kuid esimese rea kohta võin öelda, et praegusel juhul on võimalik SQL Injection.
Uuri veidi: http://en.wikipedia.org/wiki/SQL_injection
Probleemne koht täpsemalt siis: $_GET[nt]
php:
|
$sql_numbrid= mysql_query("select * from $viking order by nr DESC limit $_GET[nt]");
|
|
|
Kommentaarid: 23 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
23 |
|
tagasi üles |
|
 |
LiivaneLord
Sõpradele "Olavi"
liitunud: 20.06.2006
|
18.11.2012 20:08:33
|
|
|
spreiii, on nii õige?: (Unustan alati sellised asjad ära. )
$viking on samas failis $viking="viking". See sai alguses katsetamise eesmärgil pandud, et oma vea tõttu ei rikuks andmebaasi tabelit, kus andmed on juba õigesti sisestatud. Ja võibolla kasutan veel ja siis on mugav $viking asemele panna mingi muu tabeli nimetus, et tolle tabeli peal proovida asju.
|
|
Kommentaarid: 20 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
19 |
|
tagasi üles |
|
 |
mikk150
HV kasutaja
liitunud: 04.05.2006
|
18.11.2012 20:48:53
|
|
|
2ra kasuta " m2rki, kasuta php koodis ' m2rki. kiirem
|
|
Kommentaarid: 3 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
3 |
|
tagasi üles |
|
 |
spreiii
HV kasutaja
liitunud: 27.12.2008
|
18.11.2012 20:53:27
|
|
|
mysql_real_escape_string on jah üldjuhul piisav kaitse.
Edit: ideaalne oleks veel muidugi kontrollida, kas tegu on numbriga:
php:
|
if(! is_numeric($number)) $number = 10; // määrame numbri käsitsi, juhul kui see ei vasta nõuetele
|
|
|
Kommentaarid: 23 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
23 |
|
tagasi üles |
|
 |
LiivaneLord
Sõpradele "Olavi"
liitunud: 20.06.2006
|
18.11.2012 20:57:02
|
|
|
spreiii, andmebaasi sisestamise jaoks on mulle õpetatud kasutama htmlspecialchars().
mikk150, ee, aga ülakoma kasutades võtab PHP muutujat kui ennast, aga mitte muutujat, kui selle väärtust. Ehk siis kui $muutuja=1, siis echo "$muutuja" kirjutab "1", aga echo '$muutuja' kirjutab "$muutuja". Või sain ma sust valesti aru?
|
|
Kommentaarid: 20 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
19 |
|
tagasi üles |
|
 |
karu
HV kasutaja
liitunud: 08.08.2002
|
|
Kommentaarid: 1 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
1 |
|
tagasi üles |
|
 |
LiivaneLord
Sõpradele "Olavi"
liitunud: 20.06.2006
|
18.11.2012 22:44:24
|
|
|
Ma ei tea, olen harjunud jutumärgiga.
|
|
Kommentaarid: 20 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
19 |
|
tagasi üles |
|
 |
andrusny
Kreisi kasutaja

liitunud: 20.03.2006
|
18.11.2012 23:48:17
|
|
|
See ' pole ülakoma vaid ühekordne jutumärk. Ülakoma on see ´ või vähemasiti mina tean seda selliselt.
_________________
 |
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
 |
p2tu
HV kasutaja

liitunud: 06.11.2001
|
19.11.2012 01:11:32
|
|
|
1000 rea jaoks päringu optimeerimine ei anna sul soovitud tulemust, kuvamine kiiremaks ei muutu.
Probleem ei ole sul päringus vaid kuvamises endas. Päring ise käib ilmselt 0.0... sekundit.
Seda saad eraldi vaadata, kiire google - http://stackoverflow.com/questions/8156095/calculating-time-of-a-query-php-mysql
See 1000 rida lihtsalt html'is veebilehele kuvatakse aeglaselt muudel põhjustel nagu ka ülevalpool mainiti - brauser ise, html keel, hdd kiirus, netikiirus (suhtlus serveriga) jne.
|
|
Kommentaarid: 24 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
24 |
|
tagasi üles |
|
 |
Redikate
HV veteran

liitunud: 30.12.2005
|
19.11.2012 15:35:03
|
|
|
1000 rida on nii minimaalne andmebaas, et seal küll SQL'i taha midagi ei jää, veelvähem mingi faili lugemise taha. Nagu p2tu ütles, siis päring ise võtab ilmselt 0.0.. sekundit ja selle taha sul küll midagi ei jää.
Samamoodi on su while täiesti basic ning seegi ei võta peaaegu üldse aega, niiet aeglus peab ikkagi olema kinni juba html'i näitamises.
_________________ http://nodejs.org/
"I'm also a person. Programming is just one thing I do." |
|
Kommentaarid: 34 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
33 |
|
tagasi üles |
|
 |
2ndalpha
HV kasutaja

liitunud: 03.11.2004
|
19.11.2012 15:39:44
|
|
|
Nagu ma enne juba ütlesin, siis kõige lihtsam on mõõta kuluvat aega http://tools.pingdom.com/fpt/ abil
Muidugi võib ka Firebugi või Chromega seda teha.
Siis näeb kas asi jääb serveri, allalaadimise, renderdamise või muu taha.
|
|
Kommentaarid: 23 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
22 |
|
tagasi üles |
|
 |
Ho Ho
HV Guru

liitunud: 16.02.2002
|
19.11.2012 16:19:04
|
|
|
Olen üsnagi kindel, et su probleem on selles koodireas:
if(in_array($andmed_numbrid[$väärtus], $array_numbritest)){
Nii palju kui aru saan on tegu üsnagi kuluka operatsiooniga. Eeldades, et too $array_numbritest on samuti tuhatkond rida tehtakse sul seal umbes pool miljonit võrdlust per page load. Piirates kuvatavate ridade arvu 1000 pealt 100'le vähendaks selle ainult 1M pealt 100k peale mis kokkuvõttes ei ole ikkagi normaalne efektiivsus.
Lahenda asi SQL'is üheainsa päringuga, saad oluliselt kiirema tulemuse.
_________________ Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity" |
|
Kommentaarid: 106 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
86 |
|
tagasi üles |
|
 |
LiivaneLord
Sõpradele "Olavi"
liitunud: 20.06.2006
|
19.11.2012 17:31:20
|
|
|
Ho Ho, $array_numbritest on kasutaja poolt sisestatud numbrid, mida on 1-11. Kuna andmebaasis on natuke üle 1000 rea, siis tähendab see 1000*7*11 võrdlust.
Aga tundub, et jääb jah htmli näitamise taha kogu see tabeli näitamine. Võtsin lehe source, laadisin üles ja laeb samamoodi kaua, võiks öelda, et mõned sekundid ehk kauemgi. Tegelikult minu küsimus oligi pigem selles, et kas antud leht on mõistlik luua tabeli lahtritena või kuidagi muudmoodi. Aga ega vist paremat lahendust poleks ka, kui ainult piiramine ...
|
|
Kommentaarid: 20 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
19 |
|
tagasi üles |
|
 |
|