[PHP] num_rows of fetchen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 18:37

Saven

Administrator

Topicstarter
Hallo tweakers,

Ik zit al een tijdje met de vraag wat nou beter is te gebruiken als je een query uitvoert om iets te tellen.
Stel ik heb deze code, en er van uitgaande dat er 40.000 resultaten zijn:
PHP:
1
2
3
4
5
6
7
8
9
10
11
//Manier 1
$q = mysql_query("SELECT COUNT(id) FROM forum");
$a = mysql_fetch_array($q);

echo $a[0];

//Manier 2
$q = mysql_query("SELECT id FROM forum");
$a = mysql_num_rows($q);

echo $a;


Welke manier is dan beter en sneller?

Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:44

gorgi_19

Kruimeltjes zijn weer op :9

1e is sneller; je pompt niet alle records door de lijn heen.

[ Voor 196% gewijzigd door gorgi_19 op 26-06-2007 13:07 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Tja, dat lijkt me niet zo heel moeilijk. Denk enkel eens aan de recordsets die opgebouwd moeten worden. Je leest ze misschien niet uit, maar mysql is wel 40.000 records in het geheugen aan het klaarzetten zodat je deze straks 1 voor 1 kunt fetchen.

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


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Manier 1 natuurlijk, want bij de tweede manier moet alle data geselecteerd worden en verstuurd.

Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 18:37

Saven

Administrator

Topicstarter
Oke thnx mensen, dat verklaart een hoop :P

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Saven schreef op dinsdag 26 juni 2007 @ 13:08:
Oke thnx mensen, dat verklaart een hoop :P
Wat dacht je zelf dan als je die code ziet?
Manier 2 moet je alleen gebruiken als je toch al die data nog nodig hebt, maar meestal is dat dus niet het geval.

Acties:
  • 0 Henk 'm!

Verwijderd

Overigens klopt de code ook niet.

In het eerste geval zal $a een array bevatten en echo $a dus niet zo gek veel doen, in het tweede geval zal $a een integer bevatten.

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Verwijderd schreef op dinsdag 26 juni 2007 @ 13:11:
Overigens klopt de code ook niet.

In het eerste geval zal $a een array bevatten en echo $a dus niet zo gek veel doen, in het tweede geval zal $a een integer bevatten.
daarom wordt er dus ook de eerste entry uit die array ge-echo-ed ;)

Acties:
  • 0 Henk 'm!

  • Solopher
  • Registratie: December 2002
  • Laatst online: 11-09 14:55
Waarom niet:
PHP:
1
2
3
4
5
6
<?php
//Manier 1
$q = mysql_query("SELECT COUNT(id) FROM forum");
$a = mysql_result($q);
echo $a;
?>

Acties:
  • 0 Henk 'm!

Verwijderd

Erkens schreef op dinsdag 26 juni 2007 @ 13:12:
[...]

daarom wordt er dus ook de eerste entry uit die array ge-echo-ed ;)
:o

Dat stond er net niet...

(Of ik = is B) tekort)

[ Voor 5% gewijzigd door Verwijderd op 26-06-2007 13:25 ]


Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 18:37

Saven

Administrator

Topicstarter
Solopher schreef op dinsdag 26 juni 2007 @ 13:22:
Waarom niet:
PHP:
1
2
3
4
5
6
<?php
//Manier 1
$q = mysql_query("SELECT COUNT(id) FROM forum");
$a = mysql_result($q);
echo $a;
?>
Op de PHP website staat dat fetch_array enzo sneller is

Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Saven schreef op dinsdag 26 juni 2007 @ 13:44:
[...]

Op de PHP website staat dat fetch_array enzo sneller is
enzo.... Laat eens zien met een link :)

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Saven schreef op dinsdag 26 juni 2007 @ 13:44:
[...]

Op de PHP website staat dat fetch_array enzo sneller is
Dan moet je toch iets beter lezen. Er staat niet dat fetch_array ten alle tijden sneller is. In dit geval is het daarnaast ook overzichtelijker dat je niet een array als tussen variabele nodig hebt. Dat maakt de code wat leesbaarder.

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


Acties:
  • 0 Henk 'm!

  • Icelus
  • Registratie: Januari 2004
  • Niet online
Saven schreef op dinsdag 26 juni 2007 @ 13:44:
[...]

Op de PHP website staat dat fetch_array enzo sneller is
Alleen bij (het verwerken van) grote hoeveelheden rijen:
string mysql_result ( resource $result, int $row [, mixed $field] )

Retrieves the contents of one cell from a MySQL result set.

When working on large result sets, you should consider using one of the functions that fetch an entire row (specified below). As these functions return the contents of multiple cells in one function call, they're MUCH quicker than mysql_result(). Also, note that specifying a numeric offset for the field argument is much quicker than specifying a fieldname or tablename.fieldname argument.
http://nl3.php.net/manual/en/function.mysql-result.php

Developer Accused Of Unreadable Code Refuses To Comment


Acties:
  • 0 Henk 'm!

Verwijderd

Als id een autonummering is, dan zou
code:
1
$q = mysql_query("SELECT id FROM forum limit 1");

wellicht nog sneller werken?

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Verwijderd schreef op dinsdag 26 juni 2007 @ 13:56:
Als id een autonummering is, dan zou
code:
1
$q = mysql_query("SELECT id FROM forum limit 1");

wellicht nog sneller werken?
maar geeft niet hetzelfde resultaat, er kunnen immers records verwijderd zijn

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Verwijderd schreef op dinsdag 26 juni 2007 @ 13:56:
Als id een autonummering is, dan zou
code:
1
$q = mysql_query("SELECT id FROM forum limit 1");

wellicht nog sneller werken?
Tjongejonge, wat een ENORME bak aannames zitten in deze queries:

1: Dat de autonummering uberhaupt telkens 1 ophoogt.
2: Dat het teruggeven van een resultaat altijd eerst het laatst ingevoegde resultaat opsomt wanneer er geen volgorde gevraagd wordt.
3: Er nooit wat verwijderd is.

Als ik in mijn project een programmeur had die dit als oplossing aandroeg dan kon hij vanmiddag al op zoek naar een ander project.

[ Voor 11% gewijzigd door Janoz op 26-06-2007 14:07 ]

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


Acties:
  • 0 Henk 'm!

Verwijderd

Ok, maar is het sneller?

Acties:
  • 0 Henk 'm!

Verwijderd

Nee het is niet sneller, het is complete onzin...

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Als het je om snelheid gaat doe je gewoon:
PHP:
1
$q = 40000;

Stuk sneller dan jouw oplossing.

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


Acties:
  • 0 Henk 'm!

  • Blacksnak
  • Registratie: Oktober 2001
  • Laatst online: 07-07-2024
Janoz schreef op dinsdag 26 juni 2007 @ 14:25:
[...]

Als het je om snelheid gaat doe je gewoon:
PHP:
1
$q = 40000;

Stuk sneller dan jouw oplossing.
:X die reactie is ook duidelijk :X

Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 18:37

Saven

Administrator

Topicstarter
Blacksnak schreef op dinsdag 26 juni 2007 @ 14:30:
[...]


:X die reactie is ook duidelijk :X
Hij bedoeld denk ik dat als je aan het mierenneuken bent over parsetime, je het beste gewoon alles statisch kan doen, ipv dynamisch :P

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Nee, ik bedoel dat dit veel sneller is als je het toch niet belangrijk vind of het juiste antwoord er uit komt.

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


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 19:51

Creepy

Tactical Espionage Splatterer

Blacksnak schreef op dinsdag 26 juni 2007 @ 14:30:
[...]


:X die reactie is ook duidelijk :X
wat had je dan verwacht?

Stel, het is een autonummering veld en stel dat je zonder order by direct het *laatste* id ophaalt en stel dat het hoogste id dus gelijk is aan het aantal rijen dan nog zal een count(iets) zonder where sneller zijn aangezien de rowcount dan direct uit de table metadata gevist kan worden en de daadwerkelijke tabel niet geraadpleegd hoeft te worden.
[/miereneuken] :P

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Blacksnak
  • Registratie: Oktober 2001
  • Laatst online: 07-07-2024
Creepy schreef op dinsdag 26 juni 2007 @ 16:05:
[...]
wat had je dan verwacht?
Gaat me dan ook niet over wat nu sneller of trage is. Vond het antwoord van Janoz gewoon nogal direct en cru overkomen. :>

Acties:
  • 0 Henk 'm!

  • REDFISH
  • Registratie: Augustus 2001
  • Laatst online: 20-11-2024

REDFISH

beetje vreemd en niet lekker

Is mysql_fetch_object niet nog wat netter?

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
REDFISH schreef op dinsdag 26 juni 2007 @ 18:34:
Is mysql_fetch_object niet nog wat netter?
Waarom een object fetchen als het je echt alleen maar om 1getalletje gaat?

Acties:
  • 0 Henk 'm!

  • Alain
  • Registratie: Oktober 2002
  • Niet online
Wat ik mij eigenlijk afvroeg bij het lezen van dit topic:

Als je een situatie hebt waarbij vaak een hoeveelheid van bestaande records opgevraagd wordt en waarbij er een relatief grote hoeveelheid aan records bestaat. Dan kan ik me voorstellen dat je overgaat op een counter (met eventuele corruptie nadelen vandien, die in de tijd wel op te lossen zijn).

Waar ligt een omslagpunt in deze of eigenlijk: hoe kan je dit goed bepalen?

Dit kun je natuurlijk simpel via trail and error bepalen, maar je kunt het ook uitrekenen (uitersten). Ik vraag mij dan ook af voor welke methode een programmeur zou gaan.

You don't have to be crazy to do this job, but it helps ....


Acties:
  • 0 Henk 'm!

Verwijderd

Wat bedoel je precies? Ik begrijp je vraagstelling niet helemaal.

Wat bedoel je met een counter? Als je gegevens nodig hebt dan haal je ze op, maakt niet uit hoeveel het er zijn, heb je ze nodig dan heb je ze nodig. Als je een pagineringssysteem wil invoeren dan kun je daar simpel de functies LIMIT of bijvoorbeeld TOP van de database voor gebruiken.

Wanneer het nuttig is om van een grote lijst over te gaan naar een pagineringssysteem is een user interface kwestie en zal dus erg veel afhangen van de omstandigheden en doelgroep.

Acties:
  • 0 Henk 'm!

  • Alain
  • Registratie: Oktober 2002
  • Niet online
Ik bedoel:

Je hebt 1 miljoen records en 100 keer per seconde wordt gevraagd hoeveel records er zijn. Ga je dan een teller gebruiken om bij te houden hoeveel records er zijn of doe je dat pas bij een miljard records. Of misschien helemaal niet.

De vraag is: Hoe ga je bepalen wanneer je voor een teller kiest i.p.v. de COUNT functie in mysql?

You don't have to be crazy to do this job, but it helps ....


Acties:
  • 0 Henk 'm!

  • DRAFTER86
  • Registratie: April 2002
  • Laatst online: 10:15
AlainS schreef op dinsdag 26 juni 2007 @ 22:10:
Ik bedoel:

Je hebt 1 miljoen records en 100 keer per seconde wordt gevraagd hoeveel records er zijn. Ga je dan een teller gebruiken om bij te houden hoeveel records er zijn of doe je dat pas bij een miljard records. Of misschien helemaal niet.

De vraag is: Hoe ga je bepalen wanneer je voor een teller kiest i.p.v. de COUNT functie in mysql?
Ik heb geen idee, maar ik zou het niet raar vinden als MySql zelf die teller bijhoud ;)

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
AlainS schreef op dinsdag 26 juni 2007 @ 22:10:
Ik bedoel:

Je hebt 1 miljoen records en 100 keer per seconde wordt gevraagd hoeveel records er zijn. Ga je dan een teller gebruiken om bij te houden hoeveel records er zijn of doe je dat pas bij een miljard records. Of misschien helemaal niet.

De vraag is: Hoe ga je bepalen wanneer je voor een teller kiest i.p.v. de COUNT functie in mysql?
In 1e instantie geen teller bijhouden als het niet nodig is ( nodig bijv bij facturen etc ).

In principe gebruik ik bijna nooit tellers omdat een dbase er goede functies voor heeft en in ongeveer 95% van de gevallen de dbase het snel genoeg doet.
Te veel tellers dramatisch fout zien lopen doordat iemand "eventjes" iets in de dbase aanpast waardoor de tellers niet meer kloppen, of er vindt ergens via een admin-interface een delete actie plaats die niet het tellertje bijwerkt...

Alleen als je een teller wilt bijhouden dan moet je dit ook wel vanaf het begin meenemen ( 1x een teller ingebouwd in een app van iemand anders ( zonder documentatie ) en na 1 maand debugging aan te hebben gehad ( om te zien waar de teller allemaal inmoest ) nu nog steeds ongeveer 1x per 3 maanden een programma daarvan aan te moeten passen omdat het de teller niet goed bijwerkt en ze het programma toch alleen maar gebruiken in noodgevallen... Ondertussen had ik voor hetzelfde geld, 10% van de tijd een complete rewrite van het programma kunnen doen, maar ja dat was toen te duur )
DRAFTER86 schreef op dinsdag 26 juni 2007 @ 22:20:
[...]


Ik heb geen idee, maar ik zou het niet raar vinden als MySql zelf die teller bijhoud ;)
Welke teller??? Het aantal unieke topicnames of het aantal topics wat in een forum staat of het aantal topics wat er in 1 tabel zit, en zowieso per tabel doet volgens mij innodb standaard een schatting totdat je echt alles op hebt gehaald.

[ Voor 12% gewijzigd door Gomez12 op 26-06-2007 22:49 ]


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Blacksnak schreef op dinsdag 26 juni 2007 @ 16:10:
[...]


Gaat me dan ook niet over wat nu sneller of trage is. Vond het antwoord van Janoz gewoon nogal direct en cru overkomen. :>
Is ook niet zo vreemd. Het ID veld gebruiken voor meer dan key identificatie is gewoon ook een doodzonde binnen de database wereld.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Morax
  • Registratie: Mei 2002
  • Laatst online: 20-09 00:30
DRAFTER86 schreef op dinsdag 26 juni 2007 @ 22:20:
[...]


Ik heb geen idee, maar ik zou het niet raar vinden als MySql zelf die teller bijhoud ;)
Denk bijvoorbeeld aan een forum als gathering.tweakers.net.... In een forum als de HK staan toch al snel zo'n 30 a 40 topics in de topic listing. Om nou 30 a 40 keer een LEFT JOIN uit te voeren om posts te tellen, op een tabel met zo'n 280 miljoen records...

Reken maar uit wat sneller is ;)

What do you mean I have no life? I am a gamer, I got millions!


Acties:
  • 0 Henk 'm!

  • Blacksnak
  • Registratie: Oktober 2001
  • Laatst online: 07-07-2024
Grijze Vos schreef op dinsdag 26 juni 2007 @ 22:50:
[...]

Is ook niet zo vreemd. Het ID veld gebruiken voor meer dan key identificatie is gewoon ook een doodzonde binnen de database wereld.
I know, zo is het mij ook netjes geleerd :)

Maar dat mag de TS er niet van weerhouden om er eens een alternatieve denkwijze op toe te passen eh ;)

Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
AlainS schreef op dinsdag 26 juni 2007 @ 22:10:
De vraag is: Hoe ga je bepalen wanneer je voor een teller kiest i.p.v. de COUNT functie in mysql?
MySQL gaat niet iedere keer domweg rows tellen hoor. Sowieso heb je over het algemeen toch echt wel een index op je ID zitten, en bovendien cached MySQL ongetwijfeld ook wel. Als het echt een groot issue is zou ik dit soort queries application-side gaan cachen. Zelf een teller bijhouden vind ik nogal smerig.

https://niels.nu


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Hydra schreef op woensdag 27 juni 2007 @ 13:46:
Zelf een teller bijhouden vind ik nogal smerig.
Soms moet je wel ivm performance met joins, zoals dus al reeds als voorbeeld is genoemd: dit forum met bijvoorbeeld de reply count die in de topics list staan, je wilt echt niet voor elke view al die tellers gaan bepalen, dat is gewoon veel te zwaar voor welke database dan ook. Een simpel veld toevoegen die je increment op het moment dat je een bericht plaatst en je hebt een enorme performance winst :) Alleen even in de gaten houden als er een bericht verwijderd of verplaatst wordt.

Acties:
  • 0 Henk 'm!

Verwijderd

Een teller hoeft niet heel smerig te zijn, als je een database systeem hebt wat stored procedures en constraints aankan. Je kunt dan de boel zo regelen dat de teller door het database systeem zelf wordt bijgehouden.

Of het nuttig is om een teller bij te houden is belangrijk van te voren te verzinnen en al vanaf het begin in te bouwen. Vaak wordt het toch wel een rotzooitje, afhankelijk van hoe kritiek het systeem is kan dat erg vervelend zijn.

Bij een forum bijvoorbeeld zou je dagelijks een scriptje kunnen laten draaien die alle tellers alsnog goed zet mochten er fouten in zitten. Op die manier maakt de kwaliteit van de software niet meer uit, 1x per dag wordt het in ieder geval goed gezet (er vanuitgaande dat het bij uitzondering mis gaat, niet bij regel).

In een echte professionele applicatie kan zoiets natuurlijk niet door de beugel, je zult er dan voor moeten zorgen dat het gewoon klopt.

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Verwijderd schreef op woensdag 27 juni 2007 @ 13:53:
Bij een forum bijvoorbeeld zou je dagelijks een scriptje kunnen laten draaien die alle tellers alsnog goed zet mochten er fouten in zitten. Op die manier maakt de kwaliteit van de software niet meer uit, 1x per dag wordt het in ieder geval goed gezet (er vanuitgaande dat het bij uitzondering mis gaat, niet bij regel).

In een echte professionele applicatie kan zoiets natuurlijk niet door de beugel, je zult er dan voor moeten zorgen dat het gewoon klopt.
Waarom niet gewoon met een nette count-query bij een update de daadwerkelijke waarde herberekenen. Dat kost je ook net niks aan performance, maar is wel een stuk robuuster, en dan is je data veel zekerder up to date.

Uiteraard, als je alle scenarios afdekt, dan is een tellertje natuurlijk altijd correct, dat terzijde.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

De vraag is hoe erg afwijking is. Bij de exacte postcount van een groot forum maakt het niet uit als je er meerdere naast zit. Als je vervolgens kunt garanderen dat dit niet escaleert (door bijvoorbeeld gegarandeerd alle counts op gezette tijden weer goed te zetten) dan is dat een heel aanvaardbaar risico.

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


Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
Erkens schreef op woensdag 27 juni 2007 @ 13:49:
Soms moet je wel ivm performance met joins, zoals dus al reeds als voorbeeld is genoemd: dit forum met bijvoorbeeld de reply count die in de topics list staan, je wilt echt niet voor elke view al die tellers gaan bepalen, dat is gewoon veel te zwaar voor welke database dan ook.
Oh, mee eens hoor. Sowieso lijkt het me dat je bij een groot systeem als dit je backend toch al duidelijk scheidt van je presentatielaag, en in de tussenliggende laag prima dingen als postcounts kunt 'cachen'. Sowieso is een postcount van een heel forum niet zo kritisch dat het uitmaakt dat deze niet helemaal 100% correct is.

https://niels.nu


Acties:
  • 0 Henk 'm!

Verwijderd

Grijze Vos schreef op woensdag 27 juni 2007 @ 13:59:
[...]


Waarom niet gewoon met een nette count-query bij een update de daadwerkelijke waarde herberekenen. Dat kost je ook net niks aan performance, maar is wel een stuk robuuster, en dan is je data veel zekerder up to date.

Uiteraard, als je alle scenarios afdekt, dan is een tellertje natuurlijk altijd correct, dat terzijde.
Dat is precies wat ik zeg, als je database het kan kun je met een stored procedure en een constraint ervoor zorgen dat het altijd kloppend is.

Als je database dat niet kunt zul je dit in je programma/systeem moeten doen, natuurlijk kun je dat met een count-query doen afhankelijk van de grootte en context van de data (als die count query flink wat performance kost omdat het ingewikkelde data is en de mutatie meerdere keren per sec voorkomt is dat niet aan te raden), maar dat geeft natuurlijk geen enkele garantie. Het gaat namelijk mis wanneer je ergens vergeet het te updaten (of je nou een count query gebruikt of niet), dan klopt op dat moment de teller dus niet.

Je kunt dan met een cronjob ervoor zorgen dat in ieder geval 1x per dag (of vaker of minder vaak, net wat je wilt) de gegevens worden bijgewerkt. Iets als de postcount van een gebruiker maakt in principe weinig uit, het is enkel een idicatie maar mag best 2 a 3 ernaast zitten. Het is alleen nuttig om zoiets te doen als de uitzondering (dus dat het mis gaat) vrij weinig voorkomt, je zult dus toch ervoor moeten zorgen dat het onderliggende systeem zoveel mogelijk klopt anders is de teller niet heel nuttig.

Acties:
  • 0 Henk 'm!

  • storeman
  • Registratie: April 2004
  • Laatst online: 12:59
Om nog even terug te komen op de vraag.

Een paar tests laten de harde cijfers zien:

code:
1
2
3
4
5
6
7
8
ADOdb->RowCount(): 40000
ADOdb Executed in 24.169633865356

mysql_num_rows: 40000
PHP Executed in 23.729242086411

mysql_result: 40000
PHP Executed in 0.011626005172729


Uitgevoerd op een tabel met 40.000 records. Elke query is 100x uitgevoerd. Bij de eerste twee tests is de query:
SELECT id FROM performance
bij de laatste (fetch)
SELECT COUN(1) AS num FROM performance

Lijkt me niet zo moeilijk wie de onovertroffen winnaar is.

"Chaos kan niet uit de hand lopen"


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 19:51

Creepy

Tactical Espionage Splatterer

Dit was een MyISAM zeker? Moet je voor de gein eens herhalen met een InnoDb tabel ;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • storeman
  • Registratie: April 2004
  • Laatst online: 12:59
Zoals u wenst ;)

code:
1
2
3
4
5
6
7
8
ADOdb->RowCount(): 40000
ADOdb Executed in 77.211091041565

mysql_num_rows: 40000
PHP Executed in 77.88072514534

PhpRows fetch COUNT(1) 40000
PHP Executed in 58.928627967834


Whowh, dat scheelt :S.

Overigens heb ik me nog nooit verdiept in de verschillen. Doet er voor deze discussie ook niet toe, maar het moet nodig gebeuren (todolist += 1:P)

"Chaos kan niet uit de hand lopen"


Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
Verwijderd schreef op woensdag 27 juni 2007 @ 16:23:
Je kunt dan met een cronjob ervoor zorgen dat in ieder geval 1x per dag (of vaker of minder vaak, net wat je wilt) de gegevens worden bijgewerkt. Iets als de postcount van een gebruiker maakt in principe weinig uit, het is enkel een idicatie maar mag best 2 a 3 ernaast zitten. Het is alleen nuttig om zoiets te doen als de uitzondering (dus dat het mis gaat) vrij weinig voorkomt, je zult dus toch ervoor moeten zorgen dat het onderliggende systeem zoveel mogelijk klopt anders is de teller niet heel nuttig.
Grappig, deze overweging heb ik net een week geleden ook gemaakt :)

Ben vooral als hobby project bezig een forum te schrijven. Nu zijn er in principe threads, posts en catagories, en in principe wil je in overzichtweergave ook laten zien wanneer de laatste post was in een catagory en hoeveel posts er zijn in totaal. Voor een forum met 20 catagorieen / subfora zit je dan al snel op tientallen subqueries per refresh - granted, die cache ik natuurlijk (met Smarty om precies te zijn), maar voor de F5'ers is het wel zo lief om die cache elke 60 seconden ofzo te refreshen, zodat je nog steeds een redelijke winst kan halen door dat soort data ook in de catagory tabel op te slaan.

Hoe ik dat nu aangepakt heb is door voor m'n board class een memberfunctie te maken die voor een bepaalde catagory precies die query doet - laatste post / thread tijd, auteur en aantal posts - en die roep ik aan zodra iemand post / een nieuwe thread maakt :) Simpel en effectief, en als ik zo naar de databasestructuur van bijvoorbeeld vBulletin kijk ben ik niet de enige die daarvoor gekozen heeft :+

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • GregoryBE
  • Registratie: April 2004
  • Laatst online: 24-07 01:53
PhpBB gebruikt bijvoorbeeld ook 'SELECT COUNT(id) FROM forum'

It's just a matter of time...


Acties:
  • 0 Henk 'm!

  • Gwaihir
  • Registratie: December 2002
  • Niet online
Yep, by MyISAM tabellen is die count al opgeslagen (zoals Hydra vermoedde) en wordt er helemaal niet geteld. InnoDB tabellen blijven op dit punt.. een tikje achter ;)

Let wel: dit gaat alleen over het tellen van ALLE rijen in een tabel. Maak je een selectie, dan is het met die supersnelheid van MyISAM ook weer gedaan.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Birdie schreef op donderdag 28 juni 2007 @ 23:13:
[...]
Yep, by MyISAM tabellen is die count al opgeslagen (zoals Hydra vermoedde) en wordt er helemaal niet geteld. InnoDB tabellen blijven op dit punt.. een tikje achter ;)
Ipv achterblijven kan je het ook een bewuste ontwerpkeuze (gemaakt oa ivm transactions) noemen. :)

Kwestie van de verschillen tussen de engines kennen, en het is handig om iig deze 2 engines te kennen. Wat ook handig is, is om je statsgeilheid een beetje in bedwang leren te houden, want vaak vormen dat soort stats niet de belangrijkste feature van je applicatie. ;)

{signature}


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Ik begrijp niet waarom je het überhaupt nog probeert te verdedigen ;). Ik zou het eerder een ontwerp fout noemen dan een ontwerp keuze. Bij MySQL is alsof je uit een snelle auto of uit een veilige auto kunt kiezen, terwijl alle andere database aanbieders al hebben laten zien dat een veilige snelle auto ook gewoon gemaakt kan worden.

Dat de ontwerpers bij mysql hun eigen gedrag nog proberen goed te praten is tot daar aan toe (herinnert iemand de uitspraak "Foreign keys constraints heb je helemaal niet nodig" nog?). Het is alleen jammer dat iedereen daar vervolgens nog achteraan loopt ook.

[/rant]

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


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Ik zei niet dat het per se de beste ontwerpkeuze was. Je kan ivm de reputatie die mysql heeft ook zeggen dat een beetje KISS geen kwaad kan. :P :+

En innoDB is zeker niet perfect, wat ook verklaart waarom er een behoorlijk aantal partijen aan nieuwe storage engines bezig zijn (PBXT, Falcon, Solid, NitroEDB, Infobright en ScaleDB etc. etc.). Maar die engines zijn ook nog verre van af. :+

Maar goed, dit topic ging niet per se over SE's. :P

{signature}


Acties:
  • 0 Henk 'm!

  • Gwaihir
  • Registratie: December 2002
  • Niet online
Voutloos schreef op vrijdag 29 juni 2007 @ 08:21:
[...]
Ipv achterblijven kan je het ook een bewuste ontwerpkeuze (gemaakt oa ivm transactions) noemen. :)

[..]Wat ook handig is, is om je statsgeilheid een beetje in bedwang leren te houden, want vaak vormen dat soort stats niet de belangrijkste feature van je applicatie. ;)
Gosh.. gevoelige snaar geraakt? Meten is weten :). Tests zoals die van storeman en benoemen van de resultaten is naar mijn mening de goede manier zoiets in kaart brengen. In het beestje bij de naam noemen zie ik geen statsgeilheid, noch een directe aanbeveling of afkeuring van een engine.

Ik denk niet dat langzaam zijn ooit een bewuste ontwerpkeuze is, al is het bij MySQL's InnoDB kennelijk wel een erg makkelijk geaccepteerd bijverschijnsel van zo'n keuze. Wat Janoz zegt:
Janoz schreef op vrijdag 29 juni 2007 @ 09:19:
Bij MySQL is alsof je uit een snelle auto of uit een veilige auto kunt kiezen, terwijl alle andere database aanbieders al hebben laten zien dat een veilige snelle auto ook gewoon gemaakt kan worden.
Gelukkig lijkt dat aldaar onderhand ook een klein beetje door te dringen :). Alle ogen op Falcon?

Overigens heb ik mijn twijfels bij het gemak waarmee er nu zoveel storage engines ontstaan. Is het een model wat ruimte voor vernieuwing biedt en via natuurlijke selectie succesvol zal zijn, of is het nodeloos de aandacht van ontwikkelaars dun uitspreiden over een dozijn middelmatige engines, in plaats van een of twee echt sterke (door) te ontwikkelen?

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Birdie schreef op vrijdag 29 juni 2007 @ 12:46:
[...]
Gosh.. gevoelige snaar geraakt? Meten is weten :).
Nee, slaap er niet minder om, ja meten kan nooit kwaad. Maar lezen is ook weten, en dat innodb bepaalde metainformatie niet heeft tov myisam is ook wel te lezen. :)
In het beestje bij de naam noemen zie ik geen statsgeilheid, noch een directe aanbeveling of afkeuring van een engine.
Dat statsgeilheid sloeg niet op de verschillen van SE's, maar op het per se willen weergeven van 1001 statistieken op elke pagina.
Gelukkig lijkt dat aldaar onderhand ook een klein beetje door te dringen :). Alle ogen op Falcon?
Ik hou Falcon ook wel in de gaten, maar daar missen nu ook nog hele basic dingen aan, waardoor een aantal ubersimpele queries jankend traag zijn. Falcon is (nu nog) niet beter dan innodb, maar ik wil best wel geloven dat dat het wel kan worden.
Overigens heb ik mijn twijfels bij het gemak waarmee er nu zoveel storage engines ontstaan. Is het een model wat ruimte voor vernieuwing biedt en via natuurlijke selectie succesvol zal zijn, of is het nodeloos de aandacht van ontwikkelaars dun uitspreiden over een dozijn middelmatige engines, in plaats van een of twee echt sterke (door) te ontwikkelen?
Mee eens, er moet wel iets van 'concurrentie' zijn, maar het is nu wel erg versplinterd. Een aantal van die projecten (ik heb er genoeg niet genoemd) heeft eigenlijk ook gewoon geen kans van slagen.

{signature}


Acties:
  • 0 Henk 'm!

  • storeman
  • Registratie: April 2004
  • Laatst online: 12:59
Birdie schreef op donderdag 28 juni 2007 @ 23:13:
[...]

Let wel: dit gaat alleen over het tellen van ALLE rijen in een tabel. Maak je een selectie, dan is het met die supersnelheid van MyISAM ook weer gedaan.
Dat gaat er niet zomaar in natuurlijk. Ik heb op de twee verschillende tabellen nog een query losgelaten als:
SELECT id FROM performance WHERE (id >10 AND id<35000) OR (id >39000 AND id<40000)
en
SELECT COUN(id) FROM performance WHERE (id >10 AND id<35000) OR (id >39000 AND id<40000)

Dit gaf de volgende resultaten (InnoDB):
code:
1
2
3
4
5
6
7
8
ADOdb->RowCount(): 35988
ADOdb Executed in 33.748525857925

mysql_num_rows: 35988
PHP Executed in 34.012000083923

PhpRows fetch COUNT(1) 35988
PHP Executed in 28.839454174042


En voor myisam:
code:
1
2
3
4
5
6
7
8
ADOdb->RowCount(): 35988
ADOdb Executed in 12.230320930481

mysql_num_rows: 35988
PHP Executed in 12.112257957458

PhpRows fetch COUNT(1) 35988
PHP Executed in 2.7558028697968


Lijken me nog forse verschillen. Waaraan is dit dan toe te schrijven? Is de index functie in MyIsam beter?

"Chaos kan niet uit de hand lopen"

Pagina: 1