[php/mysql]Hoe query versnellen?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 11:40
Het ophalen van een bepaalde query duurt erg lang, zie: http://gso.ath.cx/forum.
Waardoor komt dit, overal haal ik de data zo uit de db:

PHP:
1
2
3
4
5
6
7
8
<?php
$query = "SELECT * FROM fotos WHERE id = '$id'";
$result =  mysql_db_query ($database, $query);
$quer++;

while ($foto = mysql_fetch_array ($result)) {
}
?>


Kan dit nog sneller?

|>


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Zit er een index/primary key op fotos.id?
Zonee, dan: ja.
Zoja, dan: kan ik je zo niet helpen.

Ow en als je niet alle velden gebruikt moet je sowieso niet select * doen.

Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 11:40
ACM schreef op 16 November 2002 @ 16:11:
Zit er een index/primary key op fotos.id?
Zonee, dan: ja.
Zoja, dan: kan ik je zo niet helpen.
in princiepe niet....

|>


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier


Wat, geen index?
En je vatte de hint ook niet? :P

Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 11:40
ACM schreef op 16 November 2002 @ 16:13:

[...]

Wat, geen index?
En je vatte de hint ook niet? :P
ok, kwas niet wakker....

hier de tabel

MySQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# MySQL-Front Dump 2.2
#
# Host: localhost   Database: gso
#--------------------------------------------------------
# Server version 3.23.52-nt


#
# Table structure for table 'fora'
#

CREATE TABLE `fora` (
  `id` bigint(255) NOT NULL auto_increment,
  `count` int(11) default NULL,
  `titel` varchar(150) default NULL,
  `status` int(11) default NULL,
  `rate` mediumint(9) unsigned default NULL,
  PRIMARY KEY  (`id`)
) TYPE=MyISAM;



#
# Table structure for table 'subfora'
#

CREATE TABLE `subfora` (
  `id` bigint(255) NOT NULL auto_increment,
  `titel` varchar(255) default NULL,
  `oms` varchar(255) default NULL,
  `state` int(11) default '0',
  `forumid` int(11) default NULL,
  `more` int(10) unsigned default NULL,
  `visible` tinyint(3) unsigned default '0',
  KEY `idz` (`id`)
) TYPE=MyISAM;
Ow en als je niet alle velden gebruikt moet je sowieso niet select * doen.
N00b vraag (viel te verwachten), wat dan?

|>


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 08:24

gorgi_19

Kruimeltjes zijn weer op :9

Simon schreef op 16 november 2002 @ 16:14:
N00b vraag (viel te verwachten), wat dan?
Alle velden apart definieren:

Select veld1, veld2, veld3 FROM TABLE....

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Simon schreef op 16 November 2002 @ 16:14:
ok, kwas niet wakker....

hier de tabel
Blijkbaar ben je nog niet wakker :P
De tabel fotos zit er niet tussen.
N00b vraag (viel te verwachten), wat dan?

Pak een sql-tutorial :)
SELECT eenveld, eenanderveld, ennogeenveld FROM tabel WHERE etc
Zeker als je fotos-tabel veel data (bijvoorbeeld de binaire-data van het plaatje) en je dat niet gebruikt wordt het enorm traag door de SELECT *.

Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 11:40
hmnee, maar dat is maar het voorbeeld, ik heb bij beide het probleem :)

|>


Acties:
  • 0 Henk 'm!

Verwijderd

Mooi stukje leeswerk over indexes (of zijn dat indexi?): http://www.mysql.com/doc/en/MySQL_indexes.html

Enjoy :)
Doh! |:( 8)7 :o

[ Voor 0% gewijzigd door Verwijderd op 16-11-2002 16:33 . Reden: Indices dus ... ]


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Simon schreef op 16 November 2002 @ 16:22:
hmnee, maar dat is maar het voorbeeld, ik heb bij beide het probleem :)

Ah, maar zo te zien heb je dus een primairy key erop. Je kan de bigint nog veranderen in een gewone int (ik ga er niet van uit dat je meer dan 2 miljard forums krijgt?)

Maar ik vermoed dat je code ergens anders spaak loopt kwa performance, de code die jij hierboven toont, hoe lang duurt dat?
En op wat voor server? En hoeveel entries zitten er in die tabel?

Verwijderd schreef op 16 November 2002 @ 16:26:
Mooi stukje leeswerk over indexes (of zijn dat indexi?):

indices toch? :)

Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 11:40
Het gaat om deze pagina die mij te lang duurt: http://gso.ath.cx/forum/

hij is net al wat verbeterd... maar ik denk dat het nog wel sneller kan :)

|>


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Simon schreef op 16 November 2002 @ 16:36:
Het gaat om deze pagina die mij te lang duurt: http://gso.ath.cx/forum/

hij is net al wat verbeterd... maar ik denk dat het nog wel sneller kan :)
Pagina geladen in 1.342955 seconden.
Queries gedaan: 44
44 queries ???
Ik weet niet wat je allemaal uit je database haalt, maar volgens mij kan dat ook wel in 10 queries, tot maximaal een stuk of 20.

Maar dan nog, als het een pentium-200 server is zal het niet zo veel sneller dan dit kunnen gok ik.

Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 11:40
Het is een 1000 MHz celeron, met eigenlijk 512 mb ram :)

|>


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Simon schreef op 16 november 2002 @ 16:45:
Het is een 1000 MHz celeron, met eigenlijk 512 mb ram :)

Dan moet je het aantal queries terugbrengen en aan de output te zien kan dat makkelijk.

Zoiets moet volgens mij zeker wel in een seconde minder kunnen (dus 0.3 ipv 1.3 seconde) en misschien nog wel sneller.

Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 11:40
ACM schreef op 16 November 2002 @ 16:49:

[...]

Dan moet je het aantal queries terugbrengen en aan de output te zien kan dat makkelijk.

Zoiets moet volgens mij zeker wel in een seconde minder kunnen (dus 0.3 ipv 1.3 seconde) en misschien nog wel sneller.
Ik probeer minder queries voor elkaar te krijgen maar echt lukken wil niet :(
Na het verwijderen van de active topics 35 querys ipv 44 :?

|>


Acties:
  • 0 Henk 'm!

Verwijderd

Als je JOINs en GROUP BY gebruikt kan je het aantal queries tot onder de 10 brengen, mijns inziens.

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:51
Simon schreef op 16 november 2002 @ 16:53:
[...]

Ik probeer minder queries voor elkaar te krijgen maar echt lukken wil niet :(
Na het verwijderen van de active topics 35 querys ipv 44 :?


Tja, wij kunnen je ook niet veel helpen met de weinige info die maar geeft.
Kijk eens naar al je queries, zorg ervoor dat je de juiste joins doet (als je een left join oid gebruikt, dan moet je er zeker van zijn dat dat wel nodig is, controleer of je niet voldoende hebt aan een inner join), haal enkel de nodige data op, controleer of je de nodige indices op je tabellen hebt liggen, etc....

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Simon schreef op 16 november 2002 @ 16:53:
Ik probeer minder queries voor elkaar te krijgen maar echt lukken wil niet :(
Na het verwijderen van de active topics 35 querys ipv 44 :?

9 queries voor de active topics?
Dat kan toch wel in 1??
Ala:
code:
1
2
3
4
5
6
select [de velden die je wilt]
from topics[, users, om meer relaties te krijgen enzo]
where topics.userid = users.id
[and forumid in (lijst van forums waar de gebruiker in mag komen), om meer restricties te leggen]
order by topicdatum desc [achterstevoren sorteren]
[limit 25, als je niet meer dan 25 entries wilt laten zien]

(dingen tussen [ moet je even naar kijken of je dat wel nodig hebt :) )
En dan ben je er al. Data ophalen via je while loop en dat was 1 query...

Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 11:40
Ik maak dus gebruik van een loopje waarin nog een selectie wordt gedaan om de subfora uit de db te halen, daardoor het grote aantal queries, hoe zou je dit minder kunnen maken?

|>


Acties:
  • 0 Henk 'm!

  • supakeen
  • Registratie: December 2000
  • Laatst online: 09-09 14:42
Simon schreef op 16 november 2002 @ 17:17:
Ik maak dus gebruik van een loopje waarin nog een selectie wordt gedaan om de subfora uit de db te halen, daardoor het grote aantal queries, hoe zou je dit minder kunnen maken?
Heeft ieder subfora een eigen table :? :X

Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 11:40
zmn schreef op 16 november 2002 @ 17:18:
[...]


Heeft ieder subfora een eigen table :? :X
nee, een entry in een table... Maar na het selecteren van je fora wordt er nog op subfora geselecteerd...

voor de duidelijkheid: het is een query die herhaald wordt....

|>


Acties:
  • 0 Henk 'm!

Verwijderd

Kijk eens naar de volgende query (uit de losse pols, fouten voorbehouden dus):
code:
1
2
3
4
5
6
SELECT
   f.*, s.id, s.titel
FROM 
   fora f LEFT JOIN subfora s ON f.id = s.forumid
GROUP BY
   s.id, s.titel

Hiermee haal je 80% van de data van het forumoverzicht op. Als je dezelfde technieken toepast (dus JOINs en GROUP BY), kan je daar 100% van maken. Je moet bijv. nog de tabel met posts JOINen, en dan een count doen om het aantal posts in het subforum te krijgen.

Voor de active topics moet je een tweede query maken, en dan ben je volgens mij grotendeels klaar.

HTH :)

Acties:
  • 0 Henk 'm!

  • pasz
  • Registratie: Februari 2000
  • Laatst online: 01-09 23:08
waarom staat die $id tussen haakjes ?

woei!


Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 11:40
Verwijderd schreef op 16 november 2002 @ 17:35:
Kijk eens naar de volgende query (uit de losse pols, fouten voorbehouden dus):
code:
1
2
3
4
5
6
SELECT
   f.*, s.id, s.titel
FROM 
   fora f LEFT JOIN subfora s ON f.id = s.forumid
GROUP BY
   s.id, s.titel

Hiermee haal je 80% van de data van het forumoverzicht op. Als je dezelfde technieken toepast (dus JOINs en GROUP BY), kan je daar 100% van maken. Je moet bijv. nog de tabel met posts JOINen, en dan een count doen om het aantal posts in het subforum te krijgen.

Voor de active topics moet je een tweede query maken, en dan ben je volgens mij grotendeels klaar.

HTH :)
Nu snap ik niet hoe ik het onderverdeel per categorie :( (ik ben een n00b ja :()

|>


Acties:
  • 0 Henk 'm!

Verwijderd

Loop door alle resultaten. Binnen die loop staat in f.titel welk hoofdforum het is, en in s.titel welk subforum het is. Als de f.titel van de huidige regel verschillend is dan die van de vorige regel, moet je de f.titel afdrukken. Voor iedere regel moet je de s.titel afdrukken.

Als je even nadenkt kom je hier wel uit. Druk voor de lol eens alle resultaten af, en bedenk dan wat je weg moet laten om het juiste overzicht te krijgen.

Succes :)

Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 11:40
Verwijderd schreef op 16 november 2002 @ 17:49:
Loop door alle resultaten. Binnen die loop staat in f.titel welk hoofdforum het is, en in s.titel welk subforum het is. Als de f.titel van de huidige regel verschillend is dan die van de vorige regel, moet je de f.titel afdrukken. Voor iedere regel moet je de s.titel afdrukken.

Als je even nadenkt kom je hier wel uit. Druk voor de lol eens alle resultaten af, en bedenk dan wat je weg moet laten om het juiste overzicht te krijgen.

Succes :)
Dus je moet aan het begin van het herhalen controleren of de variabele die je aan het eind van de loop hebt 'gezet' hetzelfde is?

|>


Acties:
  • 0 Henk 'm!

  • Koetjeboe
  • Registratie: Maart 2002
  • Laatst online: 17-09 20:36

Koetjeboe

Boe, zegt de koe

Over je forum, ik heb een tip wat bij mij redelijk wat hielp (0.1 seconde sneller, nu doet ie er 0.2 seconde over om een pagina met 25 posts binnen te halen)

Volgens mij haalt ie als er bijvoorbeeld 3x op een pagina door de user 'user1' wordt gepost ook 3x de info over die user op. Dit hoeft ie dus maar 1x te doen :) Gewoon al opgehaalde resultaten opslaan in een array en voor het ophalen checken of je al een keer iets opgehaald hebt voor de user :)

Acties:
  • 0 Henk 'm!

Verwijderd

Simon schreef op 16 November 2002 @ 17:57:
[...]

Dus je moet aan het begin van het herhalen controleren of de variabele die je aan het eind van de loop hebt 'gezet' hetzelfde is?
Idd, zoiets.

Ga wat rotzooien met code, expirimenteer wat. Probeer niet direct resultaat gericht te werken, maar probeer het te begrijpen. En als je iets niet snapt, of vastloopt, post dan gerust je code hier (met gebruik van de [ code ] tags), dan zijn er altijd mensen die je verder helpen.

Succes :)

Acties:
  • 0 Henk 'm!

  • Koetjeboe
  • Registratie: Maart 2002
  • Laatst online: 17-09 20:36

Koetjeboe

Boe, zegt de koe

Koetjeboe schreef op 16 November 2002 @ 17:59:
Over je forum, ik heb een tip wat bij mij redelijk wat hielp (0.1 seconde sneller, nu doet ie er 0.2 seconde over om een pagina met 25 posts binnen te halen)

Volgens mij haalt ie als er bijvoorbeeld 3x op een pagina door de user 'user1' wordt gepost ook 3x de info over die user op. Dit hoeft ie dus maar 1x te doen :) Gewoon al opgehaalde resultaten opslaan in een array en voor het ophalen checken of je al een keer iets opgehaald hebt voor de user :)

Kort gezegd, probeer zo min mogelijk dubbele date eruit te halen...maar cache dat :) Dit denk ik wel alleen doen in gevallen waar het veel voor kan komen (zoals op posts pagina's).

En ACM, je parser is cool :) Alleen dat test parse code stukje is een beetje zwaar als je er em die 10x achter elkaar laat parsen :+


edit:

Oops, dit hele bericht was als een edit bedoeld |:(

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Koetjeboe schreef op 16 November 2002 @ 17:59:
Over je forum, ik heb een tip wat bij mij redelijk wat hielp (0.1 seconde sneller, nu doet ie er 0.2 seconde over om een pagina met 25 posts binnen te halen)

Volgens mij haalt ie als er bijvoorbeeld 3x op een pagina door de user 'user1' wordt gepost ook 3x de info over die user op. Dit hoeft ie dus maar 1x te doen :) Gewoon al opgehaalde resultaten opslaan in een array en voor het ophalen checken of je al een keer iets opgehaald hebt voor de user :)

Het zal waarschijnlijk sneller zijn die info er gewoon bij te joinen :)
En een keer een iets uitgebreidere query te doen, ipv allemaal losse queries.

Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 11:40
Ok, wat mister X zei is aan het lukken, maar: in beide tabellen zijn velden met de zelfde naam.... dus dat gaat niet goed :(

|>


Acties:
  • 0 Henk 'm!

Verwijderd

Je kan de naam van de kolom aanroepen als fora.titel en subfora.titel (dus tablenaam en kolomnaam, gescheiden door een punt). Misschien is het toch een goed idee om http://www.w3schools.com/sql/ nog maar eens door te nemen, vaan voor naar achter. ;)

Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 11:40
Verwijderd schreef op 16 november 2002 @ 19:11:
Je kan de naam van de kolom aanroepen als fora.titel en subfora.titel (dus tablenaam en kolomnaam, gescheiden door een punt). Misschien is het toch een goed idee om http://www.w3schools.com/sql/ nog maar eens door te nemen, vaan voor naar achter. ;)
Dat gaat dus niet omdat het als loop in een array wordt gezet.... of heb ik het nu fout?

|>


Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 11:40
Het lukt me nog steeds niet om velden met de zelfde naam eruit te halen... hoe doe ik dat?

|>


Acties:
  • 0 Henk 'm!

  • _-= Erikje =-_
  • Registratie: Maart 2000
  • Laatst online: 15-09 14:23
stel je hebt een veld "naam" in de tabel forum en in de tabel subforum dan krijg je
code:
1
"SELECT forum.naam, subforum.naam from forum, subforum"


als je moet joinen kun je ook gewoon de tabelnaam voor de kolomnaam zetten
code:
1
JOIN subforum ON forum.id = subforum.id

Acties:
  • 0 Henk 'm!

Verwijderd

Wat ook nog kan:

code:
1
"SELECT forum.naam AS NAAM1, subforum.naam AS NAAM2 from forum, subforum"


waarbij je dan dus verder kan werken met:

code:
1
"WHERE NAAM1='blaat' AND NAAM2='blaaaaaat'"


En ook bij het uitlezen van je mysql-resultaat krijg je kolommen met als naam NAAM1 en NAAM2.

Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 11:40
Ik heb gedaan wat jullie zeiden... maar de query duurt nog te lang: http://gso.ath.cx/forum/showfora.php :( hoe kan dit, ik heb et geminimaliseerd tot 1 query...

|>


Acties:
  • 0 Henk 'm!

  • xerix
  • Registratie: Januari 2001
  • Laatst online: 10-12-2020
Pak eens een SQL boek zou ik zeggen...

vtec just kicked in yo!


Acties:
  • 0 Henk 'm!

Verwijderd

xerix schreef op 17 November 2002 @ 13:03:
Pak eens een SQL boek zou ik zeggen...
-1 Overbodig: lees dit topic nog maar eens door: [rml][ mod] Verandering modbeleid P&W[/rml]
Simon schreef op 17 November 2002 @ 09:06:
Ik heb gedaan wat jullie zeiden... maar de query duurt nog te lang: http://gso.ath.cx/forum/showfora.php :( hoe kan dit, ik heb et geminimaliseerd tot 1 query...
Als je geen code post blijft het maar een beetje gokken wat er gebeurt, dus kan niemand je concrete suggesties geven. Gebruik wel de [ code ] tags aub.

Verder zou je met de time() functie op verschillende plaatsen in je code de tijd kunnen afdrukken, zodat je zo ziet welk deel het langzaamst is.

Ook kan je een stukje lezen over MySQL database performance optimalizatie: http://www.mysql.com/doc/en/MySQL_Optimisation.html

Succes :)
Pagina: 1