Avaleht
uus teema   vasta Tarkvara »  WWW »  Leht laeb aeglaselt väga suure tabeli tõttu märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
mine lehele 1, 2  järgmine
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
LiivaneLord
Sõpradele "Olavi"

liitunud: 20.06.2006




sõnum 17.11.2012 21:16:25 Leht laeb aeglaselt väga suure tabeli tõttu vasta tsitaadiga

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:
  1. 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
vaata kasutaja infot saada privaatsõnum
spreiii
HV kasutaja

liitunud: 27.12.2008




sõnum 17.11.2012 22:55:17 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 17.11.2012 23:12:37 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
LiivaneLord
Sõpradele "Olavi"

liitunud: 20.06.2006




sõnum 18.11.2012 00:37:02 vasta tsitaadiga

andrusny, tiba üle 1000 rea. Peab vist lehekülgede peale mõtlema jah.

php:
  1. $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
vaata kasutaja infot saada privaatsõnum
p2tu
HV kasutaja
p2tu

liitunud: 06.11.2001



Autoriseeritud ID-kaardiga

sõnum 18.11.2012 01:05:31 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
2ndalpha
HV kasutaja
2ndalpha

liitunud: 03.11.2004




sõnum 18.11.2012 01:27:56 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
LiivaneLord
Sõpradele "Olavi"

liitunud: 20.06.2006




sõnum 18.11.2012 01:31:38 vasta tsitaadiga

p2tu, ok, teen siis mitu lehte. icon_wink.gif
Kommentaarid: 20 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 19
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk150
HV kasutaja

liitunud: 04.05.2006



Autoriseeritud ID-kaardiga

sõnum 18.11.2012 16:21:41 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
2ndalpha
HV kasutaja
2ndalpha

liitunud: 03.11.2004




sõnum 18.11.2012 16:36:17 vasta tsitaadiga

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? icon_smile.gif
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
vaata kasutaja infot saada privaatsõnum
LiivaneLord
Sõpradele "Olavi"

liitunud: 20.06.2006




sõnum 18.11.2012 18:42:01 vasta tsitaadiga

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. icon_biggrin.gif Rohkem pole õnneks tulnud ja leht ikkagi avanes uue refreshiga. icon_smile.gif
Kommentaarid: 20 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 19
tagasi üles
vaata kasutaja infot saada privaatsõnum
spreiii
HV kasutaja

liitunud: 27.12.2008




sõnum 18.11.2012 19:00:38 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
LiivaneLord
Sõpradele "Olavi"

liitunud: 20.06.2006




sõnum 18.11.2012 19:24:53 vasta tsitaadiga

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:
  1.                                                                 $sql_numbrid=mysql_query("select * from $viking order by nr DESC limit $_GET[nt]");
  2.                                                                 while($andmed_numbrid=mysql_fetch_array($sql_numbrid)){
  3.                                                                                         if(in_array($andmed_numbrid[$väärtus], $array_numbritest)){
  4.                                                                                                 if($väärtus=="lisa1" or $väärtus=="lisa2"){
  5.                                                                                                         $värv="green";
  6.                                                                                                         $y=$y+1;
  7.                                                                                                 }
  8.                                                                                                 else{
  9.                                                                                                         $värv="red";
  10.                                                                                                         $x=$x+1;
  11.                                                                                                 }
  12.                                                                                                 $andmed_numbrid[$väärtus]="<span style='color:$värv$joon'>$andmed_numbrid[$väärtus]</span>";
  13.                                                                                                 $stiil[$väärtus]=" style='height:18px;width:18px;border:2px solid $värv;$p'";
  14.                                                                                         }
  15.                                                                                         else{
  16.                                                                                                 $andmed_numbrid[$väärtus]="<span style='font-weight:normal$joon'>$andmed_numbrid[$väärtus]</span>";
  17.                                                                                                 $stiil[$väärtus]=" style='height:18px;width:18px;border:2px solid $prgb;$p'";
  18.                                                                                         }
  19.                                                                                         if($v_puudub==1){
  20.                                                                                                 $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>";
  21.                                                                                         }
  22.                                                                                         else{
  23.                                                                                                 $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>";
  24.                                                                                         }
  25.                                                                                 if($x>1){
  26.                                                                                         if($x==2 && empty($y)){
  27.                                                                                                 $tabamus="";
  28.                                                                                         }
  29.                                                                                         else{
  30.                                                                                                 $tabamus="<span style='color:green'>$x</span>";
  31.                                                                                                 $nool=">";
  32.                                                                                         }
  33.                                                                                         if( $x==2 && $y>0 or $x==5 && $y>0){
  34.                                                                                                 $y=1;
  35.                                                                                                 $tabamus="<span style='color:green'>$x+$y</span>";
  36.                                                                                                 $nool=">";
  37.                                                                                         }
  38.                                                                                         if($x==6 && $z>0){$tabamus="<span style='color:green'>$x+</span>";
  39.                                                                                         $nool=">";
  40.                                                                                 }
  41.                                                                         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>";
  42.                                                                 }




Ärge siis näkku lööge, kui midagi on totaalselt valesti tehtud. Hobi mõttes olen progenud. icon_razz.gif

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
vaata kasutaja infot saada privaatsõnum
spreiii
HV kasutaja

liitunud: 27.12.2008




sõnum 18.11.2012 19:39:14 vasta tsitaadiga

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:
  1. $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
vaata kasutaja infot saada privaatsõnum
LiivaneLord
Sõpradele "Olavi"

liitunud: 20.06.2006




sõnum 18.11.2012 20:08:33 vasta tsitaadiga

spreiii, on nii õige?: (Unustan alati sellised asjad ära. icon_biggrin.gif)

php:
  1. sql_numbrid=mysql_query("select * from $viking order by nr DESC limit ".mysql_real_escape_string($_GET[nt]));


$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. icon_smile.gif
Kommentaarid: 20 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 19
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk150
HV kasutaja

liitunud: 04.05.2006



Autoriseeritud ID-kaardiga

sõnum 18.11.2012 20:48:53 vasta tsitaadiga

2ra kasuta " m2rki, kasuta php koodis ' m2rki. kiirem
Kommentaarid: 3 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 3
tagasi üles
vaata kasutaja infot saada privaatsõnum
spreiii
HV kasutaja

liitunud: 27.12.2008




sõnum 18.11.2012 20:53:27 vasta tsitaadiga

mysql_real_escape_string on jah üldjuhul piisav kaitse. icon_smile.gif
Edit: ideaalne oleks veel muidugi kontrollida, kas tegu on numbriga:
php:
  1. $number = mysql_real_escape_string($_GET[nr]);
  2. 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
vaata kasutaja infot saada privaatsõnum
LiivaneLord
Sõpradele "Olavi"

liitunud: 20.06.2006




sõnum 18.11.2012 20:57:02 vasta tsitaadiga

spreiii, andmebaasi sisestamise jaoks on mulle õpetatud kasutama htmlspecialchars(). icon_razz.gif

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
vaata kasutaja infot saada privaatsõnum
karu
HV kasutaja

liitunud: 08.08.2002




sõnum 18.11.2012 22:30:50 vasta tsitaadiga

mikk150 kirjutas:
2ra kasuta " m2rki, kasuta php koodis ' m2rki. kiirem
http://nikic.github.com/2012/01/09/Disproving-the-Single-Quotes-Performance-Myth.html
Kommentaarid: 1 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 1
tagasi üles
vaata kasutaja infot saada privaatsõnum
LiivaneLord
Sõpradele "Olavi"

liitunud: 20.06.2006




sõnum 18.11.2012 22:44:24 vasta tsitaadiga

Ma ei tea, olen harjunud jutumärgiga.
Kommentaarid: 20 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 19
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 18.11.2012 23:48:17 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
p2tu
HV kasutaja
p2tu

liitunud: 06.11.2001



Autoriseeritud ID-kaardiga

sõnum 19.11.2012 01:11:32 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
Redikate
HV veteran
Redikate

liitunud: 30.12.2005




sõnum 19.11.2012 15:35:03 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
2ndalpha
HV kasutaja
2ndalpha

liitunud: 03.11.2004




sõnum 19.11.2012 15:39:44 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
Ho Ho
HV Guru
Ho Ho

liitunud: 16.02.2002




sõnum 19.11.2012 16:19:04 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
LiivaneLord
Sõpradele "Olavi"

liitunud: 20.06.2006




sõnum 19.11.2012 17:31:20 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  WWW »  Leht laeb aeglaselt väga suure tabeli tõttu mine lehele 1, 2  järgmine
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.