Toon posts:

[PHP/MySQL] query's sloom maar ook weer snel...

Pagina: 1
Acties:

Verwijderd

Topicstarter
Als ik een query doe met PHP m.b.t MySQL duurt het echt lang voordat er een 'result' is... waarom?

als ik dit zelfde doe met MySQL-Front zie ik binnen 1 secode data op me scherm staan of het nu text is of nie :?...

waarom?..

Help! :) tnx.

/me zijn db is 1.9mb met ruim 40.000 records...

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Check in phpMyAdmin of je wel een index op het veld heb staan waarop je zoekt.

  • Apache
  • Registratie: Juli 2000
  • Laatst online: 14-09 22:46

Apache

amateur software devver

dan lijjkt het met dat de bottleneck in je php zit, misschien wat time printjes om te zien waar het probleem zit?

If it ain't broken it doesn't have enough features


Verwijderd

Topicstarter
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?
    $sql = "SELECT *
            FROM galleryphoto
            WHERE views>1
            AND id='$id'
            ORDER BY views
            DESC
            LIMIT 0, 10";
    $result = mysql_query($sql);

    if (mysql_num_rows($result) >= 10) {
        $loopje = 9;
    }else{
        $loopje = mysql_num_rows($result);
    }

    for ($i; 0 < $loopje; $i++) {
        $tmp[$i] = mysql_fetch_assoc($result);
        echo $tmp[$i][gallery];
    }
?>

:{ dat moet toch niet zo moeilijk zijn en hoe wordt dat met die index velden bedoeld? :D

  • Rense Klinkenberg
  • Registratie: November 2000
  • Laatst online: 23:45
Uitleg over indexen mag je zelf op internet zoeken, want daar staat het ongetwijfeld beter dan dat ik kan uitleggen :)

Ik zou alleen wel een index gooien op views

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Probeer eens deze query
code:
1
2
3
4
5
6
SELECT *
FROM galleryphoto
WHERE id='$id'
AND views>1
ORDER BY views DESC     
LIMIT 0, 10

Verwijderd

Topicstarter
Op donderdag 31 januari 2002 23:07 schreef Orphix het volgende:
Probeer eens deze query
code:
1
2
3
4
5
6
SELECT *
FROM galleryphoto
WHERE id='$id'
AND views>1
ORDER BY views DESC     
LIMIT 0, 10
:D Duurt nog eeuwen en zie eingelijk geen verschil :P

Verwijderd

Topicstarter
:D volgens mij ligt het aan de kant van PHP :{ want volgens mij crashed ie :{

Verwijderd

Moet je via een script kijken hoelang jouw pagina erover doet om het te laden. Zo'n script was hier op het forum gepost moet je eventjes zoeken. Dan heb je het resultaat in milliseconden.

Verwijderd

Topicstarter
Jawel maar als het met het script 15 minuten duurt terwijl de query maar 5 seconden in beslag neemt... heeft dat weinig zin :{

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 23:41
Waarom in godsnaam gebruik je * bij je select? Dat is echt zó fout!! |:(

  • Apache
  • Registratie: Juli 2000
  • Laatst online: 14-09 22:46

Apache

amateur software devver

Op vrijdag 01 februari 2002 07:02 schreef dennisdotcom het volgende:
Waarom in godsnaam gebruik je * bij je select? Dat is echt zó fout!! |:(
Als hij alle velden van die table nodig heeft zal dat weinig verschil uitmaken als je de query volledig uitschrijft hoor :P

If it ain't broken it doesn't have enough features


Verwijderd

Topicstarter
idd maar okey voor het aantal rows is count(*D beter :P maar dat wil nog niet betekenen dat met een * mysql/php zeer sloom wordt en zelfs crashed :)

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 21:05

Kees

Serveradmin / BOFH / DoC
PHP:
1
2
3
4
5
6
7
8
9
10
11
<?
$result = mysql_query($sql);    
if (mysql_num_rows($result) >= 10) {        
$loopje = 9;    
}else{        
$loopje = mysql_num_rows($result);    
}    
for ($i; 0 < $loopje; $i++) {        
$tmp[$i] = mysql_fetch_assoc($result);        
echo $tmp[$i][gallery];    }
?>

Ik snap het niet helemaal, waarom gebruik je een forlus?
gebruik gewoon iets als:
PHP:
1
2
3
4
5
6
<?
while ($tmp1 = mysql_fetch_assoc($result)) { // veel liever fetch_array/row
$tmp[] = $tmp1; // als je niet perse wil printen, kun je ook meteen $tmp[] = mysql_fetch.. doen)
echo $tmp1[gallery];
};
?>

om maar iets te noemen, hiermee vermijd je forlussen die niet stoppen enzo :)

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12-09 21:31

Janoz

Moderator Devschuur®

!litemod

PHP:
1
2
3
<?
for ($i; 0 < $loopje; $i++) {
?>

Maak van die 0 nou eens een $i..

Verder sluit ik me bij dennisdotcom aan.. Het gebruiken van select * is vies!

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Grum
  • Registratie: Juni 2001
  • Niet online
een index op et veld 'views' zal zeker helpen :)

en een index (de minste complexe) maak je zo:

create index [naamvdindex] on [tabel]([veld]);

dus dat zou bij jou worden:

create index ViewsIndex on galleryphoto(views);

en voor meer info .. http://www.mysql.com/doc/C/R/CREATE_INDEX.html

alstu ;)

[edit]
als we dan toch naar speed gaan kijken .. gebruik dan geen mysql_fetch_assoc maar een mysql_fetch_array evt in combo met list()
PHP:
1
2
3
4
<?
while(list($veld1,$veld2,$veld3) = mysql_fetch_array($theResult))
   {}
?>

Verwijderd

Topicstarter
:D idd die $i was het gehele probleem, maar vertel me eens waarom is * vies coden en count(*D niet?... beetje raar mja

en ik ga ff het volgende stukje lezen over Indexes ;)

  • steenz
  • Registratie: Oktober 2000
  • Laatst online: 13-09 16:22
Misschien heeft het er iets mee te maken dat je eerst alle gegevens in een array stopt... Met 40.000 records kan dit array nogal groot worden (hangt van type variabele af) en dus je computer misschien wat aan de trage kant...

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Gefeliciteerd Janoz!

Ik snap het niet helemaal, want volgens mij doet onderstaand hetzelfde en veel korter:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?
    $sql = "SELECT *
            FROM galleryphoto
            WHERE views>1
            AND id='$id'
            ORDER BY views
            DESC
            LIMIT 0, 9";
    $result = mysql_query($sql);

    for ($i; $i < mysql_num_rows($result); $i++) {
        $tmp[$i] = mysql_fetch_assoc($result);
        echo $tmp[$i][gallery];
    }
?>

Verwijderd

Een for loop is over het algemeen langzamer, omdat php gewoon meer info moet verwerken... Verder kun je in die while versie van janoz meteen met de data aan de slag, terwijl je die in jouw versie eerst nog moet ophalen, snapje?

Verder is met * coden 'vies' omdat MySQL nu uit moet zoeken welke velden er in de tabel staan en deze dan terug gaat geven, als je alles voluit schrijft, hoeft MySQL niks meer uit te zoeken... Verder is * in sommige gevallen helemaal niet zo 'vies', als je alle tabellen nodig hebt bijvoorbeeld... Als je er maar 2 nodig hebt, dan moet je wel gewoon voluit schrijven.
Let wel op dat als je op een veld sorteert, je dit veld niet eerst uit de db hoeft te halen...
Pagina: 1