Sebesség: count vagy új mező?
Sziasztok ismét!
Ha adott két táblám, az egyik usereket tartalmaz, a másik pedig a userek által birtokolt objektumokat. A második tábla uid oszlopon keresztül van kapcsolva az első táblához. A userek adminisztrációjánál, szükséges, hogy az adatbázisból való lekérdezés során a birtokolt objektumok számát is megkapjam. Mi itt az elegánsabb, és gyorasbb megoldás?
1. A user táblába felvinni, egy oszlopot, ahol tárolom az aktuális user által birtokolt elemek számát. Ezt az egyszerűbb megvalósítani, a lekérdezés, is gyors gondolom, hiszen elég egyetlen táblához hozzápiszkálni, ugyanakkor plusz adat minden sorban.
2. A lekérdezésben joinnal, és counttal megoldani. Nyilván ez lassabb, de nincs plusz adat. Milyen PHP-n keresztüli query-vel lehetne ezt szépen lekérni?
Köszi!
■ Ha adott két táblám, az egyik usereket tartalmaz, a másik pedig a userek által birtokolt objektumokat. A második tábla uid oszlopon keresztül van kapcsolva az első táblához. A userek adminisztrációjánál, szükséges, hogy az adatbázisból való lekérdezés során a birtokolt objektumok számát is megkapjam. Mi itt az elegánsabb, és gyorasbb megoldás?
1. A user táblába felvinni, egy oszlopot, ahol tárolom az aktuális user által birtokolt elemek számát. Ezt az egyszerűbb megvalósítani, a lekérdezés, is gyors gondolom, hiszen elég egyetlen táblához hozzápiszkálni, ugyanakkor plusz adat minden sorban.
2. A lekérdezésben joinnal, és counttal megoldani. Nyilván ez lassabb, de nincs plusz adat. Milyen PHP-n keresztüli query-vel lehetne ezt szépen lekérni?
Köszi!
2 lekérdezés
A következőt írtam
Mennyivel lehet gyorsabb a két lekérdezéssel?
Miért nem méred le a
$eredmeny = mysql_query($sql);
print microtime(true) - $ido1;
Köszi az eddigieket, közben
Ha a joinos változatot használom, akkor a WHERE tudok hivatkozni valahogy az elemszámra?
A fenti lekérdezésnél uoCount a userhez kapcsolódó elemek száma a rekordban, de WHERE ágban, hogyan tudnék erre az adatra hivatkozni?
Ha például csak a tíznél több objektumot birtokló usereket akarom lekérdezni?
Ha a joinos változatot
Indexek + HAVING
Ebben az esetben a MySQL az adatok érintése nélkül meg tud válaszolni különböző aggregált függvényeket. Az egyes indexhez tartozó elemszám (vagyis COUNT) pedig nyilvánvalóan tárolva van a metaadatban, úgyhogy ennek a sebessége miatt ne aggódj.
Ha szűrni szeretnél aggregált kifejezésre, akkor a HAVING lesz a barátod. Próbáld elkéerülni ha nem feltétlenül szükséges. Pl listázzuk azokat a usereket akikhez tíznél több objektum tartozik.
Ezért szeretek itt kérdezni.
Egyébként a query stringet mindig az alapján állítom össze, hogy milyen szűrési adatok szükségesek, szóval csak akkor kerül be valami, ha tényleg szükség van rá, így a having sem része alapértelmezésben.
Az objektumok táblában egyenlőre nincs index a uid oszlopon. De vbence kommentje enyhén azt sugallja, hogy ajánlott hogy legyen. :)
Ellenőrző kérdés: miért o.user_id-ket számoltuk, miért nem mondjuk u.id-ket? <-ezt nem nagyon értem, nyilván azért nem az u.id-t mert nem a userek száma kell, hanem az birtokolt objektumok száma. Ezért amit írtál példa az nem azt csinálja ami nekem kell, mert ha az o.uid-t számolom, az egy lesz mindig (mivel egy adott objektum, csak egy userhez tartozhat).
Nem egészen
Ha nem joint használunk hanem egyszerű where-t, akkor nem áll fenn ez a probléma vagyis a következő két lekérdezés ugyanazt az eredményt adja: