Toon posts:

[MySQL] SELECT COUNT verschil vraag.

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0Henk 'm!

  • Gigazone
  • Registratie: Februari 2008
  • Laatst online: 18-03 10:30
Hallo,

Ik ben bezig met het schrijven van een CSV import script om op die manier PHP/MySQL te leren.

Ik lees automatisch 6 bestanden in van ieder 25k regels in de tabel 'products'.

Nu zie ik in phpmyadmin voor de tabel products ~159,533 rijen, wat vreemd is aangezien 5x25k 150k is. Na een beetje Googlen kwam ik erachter dat de tilde (~) , circa betekent. Dus okay, het is ruwweg dat aantal rijen give or take een percentage.

Maar ik wilde graag weten hoeveel rijen er nu daadwerkelijk zijn ingelezen. dus kwam ik met een COUNT op de proppen.

code:
1
SELECT COUNT(*) from products


resultaat: 159,533, hmm, vreemd aangezien ik maar 150k regels heb ingelezen.
zouden er dan dubbele zijn? Toch eens kijken of er dubbele EAN in de tabel staan.

code:
1
SELECT EAN FROM product_prices GROUP BY EAN HAVING COUNT(*)  > 1


Resultaat = 0
raar, hoeveel unieke EAN staan er dan in?

code:
1
SELECT EAN FROM product_prices GROUP BY EAN HAVING COUNT(*)  = 1


Resultaat = 150,000

wel verhipt, maar de count gaf toch iets anders aan? Nog maar een keer dan

code:
1
SELECT COUNT(*) from products


resultaat = 150,000

Nu breekt mijn spreekwoordelijke klomp!
Nog even iets anders proberen dan maar

code:
1
SELECT * from products


Resultaat: "Showing rows 0 - 24 (150093 total, Query took 0.0020 seconds.)"


Nou snap ik er dus helemaal niets meer van. Moet ik na het inlezen een reindex initieren om een juist aantal rijen te krijgen in een count?

En waarom zijn er verschillen tussen " SELECT * from products" en "SELECT COUNT(*) from products" ? :?

Beste antwoord (via Gigazone op 07-05-2019 21:02)


  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Gigazone schreef op dinsdag 7 mei 2019 @ 16:59:
Nou snap ik er dus helemaal niets meer van. Moet ik na het inlezen een reindex initieren om een juist aantal rijen te krijgen in een count?
MySQL heeft een cache zitten op:
SQL:
1
2
SELECT COUNT(*)
FROM table


Als je daar omheen wil werken dan kan je gewoon een conditie erbij zetten die altijd waar is. Bijvoorbeeld iets als dit:

SQL:
1
2
3
SELECT COUNT(*)
FROM table
WHERE id > 0


Of de niet-standaard MySQL only optie:
SQL:
1
2
SELECT SQL_NO_CACHE COUNT(*)
FROM table



Mocht je correcte resultaten willen dan zou ik je aanraden om PostgreSQL eens te proberen :)
Daarbij hoef je je geen zorgen te maken om vreemde resultaten door caching. Mocht je query fout zijn dan krijg je gewoon een foutmelding in plaats van een approximatie wat niet altijd klopt. Mocht je data fout zijn dan kan je het er gewoon niet in zetten :P

[Voor 5% gewijzigd door Wolfboy op 07-05-2019 17:58]

Blog [Stackoverflow] [LinkedIn]

Alle reacties



Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee