Toon posts:

[MySQL] SELECT COUNT verschil vraag.

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0Henk 'm!

  • Gigazone
  • Registratie: februari 2008
  • Laatst online: 07-11 20:19
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


Acties:
  • 0Henk 'm!

  • MAX3400
  • Registratie: mei 2003
  • Nu online

MAX3400

XBL: OctagonQontrol

Misschien even een andersommetje; puur ter jouwer controle: wat nu als je alle produkten weer dumpt naar een CSV, deze inleest in een applicatie als Excel en dan daar een "de-duplicatie" uitzoekt?

Uit mijn hoofd; select * leest alle rows uit ongeacht of / wat ingevuld is (bij een gebrekkige import kan je dus ook empty rows importeren). Je zou natuurlijk ook een extra statement kunnen toevoegen in je query zoals controle of kolom 2 en kolom 5 beiden een waarde bevatten (waarvan jij zeker weet dat die er moet zijn).

Ondanks de ~ vind ik het een best groot verschil dat je 150K rows of 160K rows ziet; dat is bijna 6% meer.

Mijn antwoorden zijn vaak niet snowflake-proof


Acties:
  • 0Henk 'm!

  • Kaaswagen
  • Registratie: februari 2005
  • Laatst online: 24-11 00:47
Misschien dat dit artikel wat helderheid brengt?

Wat geeft
MySQL:
1
2
SELECT category,COUNT(DISTINCT(EAN)) FROM products
GROUP BY category;
? (aangenomen dat je iets als category hebt)

It's a figure of speech, Morty. They're bureaucrats, I don't respect them.


Acties:
  • Beste antwoord
  • +2Henk 'm!

  • 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]


Acties:
  • +1Henk 'm!

  • Gigazone
  • Registratie: februari 2008
  • Laatst online: 07-11 20:19
Bedankt allemaal, hier kan ik wat mee. En weer iets nieuws geleerd vandaag!
MAX3400 schreef op dinsdag 7 mei 2019 @ 17:10:

Ondanks de ~ vind ik het een best groot verschil dat je 150K rows of 160K rows ziet; dat is bijna 6% meer.
Ik heb gelezen (niet mijn woorden) dat er wel een verschil kan zitten van 40~50%. Een beetje een overheids database dus… : Tsja, we denken dat het 500 miljoen is, maar het kan ook 1 miljard worden ;)


Nintendo Switch (OLED model) Apple iPhone 13 LG G1 Google Pixel 6 Call of Duty: Vanguard Samsung Galaxy S21 5G Apple iPad Pro (2021) 11" Wi-Fi, 8GB ram Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2021 Hosting door True

Tweakers maakt gebruik van cookies

Bij het bezoeken van het forum plaatst Tweakers alleen functionele en analytische cookies voor optimalisatie en analyse om de website-ervaring te verbeteren. Op het forum worden geen trackingcookies geplaatst. Voor het bekijken van video's en grafieken van derden vragen we je toestemming, we gebruiken daarvoor externe tooling die mogelijk cookies kunnen plaatsen.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Forum cookie-instellingen

Bekijk de onderstaande instellingen en maak je keuze. Meer informatie vind je in ons cookiebeleid.

Functionele en analytische cookies

Deze cookies helpen de website zijn functies uit te voeren en zijn verplicht. Meer details

janee

    Cookies van derden

    Deze cookies kunnen geplaatst worden door derde partijen via ingesloten content en om de gebruikerservaring van de website te verbeteren. Meer details

    janee