ugrás a tartalomhoz

Nagymennyiségű adatok kezelése

mahoo · 2010. Júl. 6. (K), 18.42
Sziasztok, a fenti témával kapcsolatban lennének (részben) elméleti kérdéseim:

Első körben az érdekelne, hogy ha van egy milliós nagyságrendű rekorddal rendelkező mysql/myisam táblám. Egy adott ID-it keresnék a táblában, hogy benne van-e.

Kérdés, hogy hogyan a leggyorsabb?
- SELECT-tel a táblában
- Előbb SELECT-tel egy tömböt feltölteni (ha egyáltalán 'elbírja' egy szimpla tömb a sok adatot, esetleg egy session tömb) és majd abban abban keresni
- Előbb SELECT-tel egy fájlt feltölteni és majd abban abban keresni

Lennének majd további kérdéseim is, de alapvetően ez az elsődleges. Előre is köszönöm!!!
 
1

SELECT-tel a táblában

Poetro · 2010. Júl. 6. (K), 18.49
SELECT-tel a táblában lesz a leggyorsabb, mivel amennyiben a mezőn van index, akkor azt fogja használni. Amennyiben van rendezés is a lekérdezésben, akkor lehet magától létre fog hozni egy fájlt a rendezéshez, amennyiben kevés lenne a memória ehhez (lásd using filesort az EXPLAIN-ben).
A többi sokkal memória illetve I/O igényesebb.
2

Köszönöm a választ Poetro, de

mahoo · 2010. Júl. 6. (K), 20.02
Köszönöm a választ Poetro, de mint rájöttem kicsit pongyolán fogalmaztam :) ezért most leírnám, hogy konkrétan miről is lenne szó.

Egy negyedfokú írányított fa strukturáról, melynek csomópontjai a regisztrált felhasználók.

A felhasználó tábla fontosabb tulajdonságai: ID, szülő, szint, sorszám ( sorszám: az adott szülő alá közvetlenül csatlakoző csomópontok sorrendjét adja meg, értéke 1-4 )

A grafikus megjelenés kb ez:
http://kepfeltoltes.hu/view/100706/mlm_www.kepfeltoltes.hu_.jpg

Ha a regisztrált felhasználó ID-ja 3, akkor a hálózatba lépve csak az alatta lévő struktúrát láthassa, tehát se az 1-es se a 2-es, 6-os fájába ne tudjon átlépni.
Ezt ugye elérhetem, ha csinálok egy ciklust, mely addig fut amíg a lekérdezésnek van eredménye.

Kb így, remélem érthető:

do{
1. ciklus: SELECT * FROM felhasznalok WHERE id=3 LIMIT 1 -> szülők és szintek tárolása a következő ciklushoz
2. ciklus: SELECT * FROM felhasznalok WHERE szulo=... AND szint=... LIMIT 4 -> szülők és szintek tárolása a következő ciklushoz
3. ciklus: SELECT * FROM felhasznalok WHERE szulo=... AND szint=... LIMIT 16 -> szülők és szintek tárolása a következő ciklushoz
.
.
.
}while(eredmeny>0)

Ezzel a ciklussal a teljes adatbázisból ki tudom szűrni, hogy ki tartozik az adott struktúrába! Ennek eredményét is tárolnom kellene valahol, valamiben.
Azért, mert ha például ID=3 azt mondja, hogy ugorjunk a ID=6-ra akkor le tudjam ellenőrizni, hogy az az ő strukturájában szerepel vagy sem.


Tehát valójában azt kell megvalósítani, hogy adott ID-val belépve ismerjem a saját fámat, meg is tudjam az jeleníteni bármelyik pontjától és tudjam, hogy egy adott elem tagja-e az én hálózatomnak. És természetesen a lehető leggyorsabban!!!
Hogyan 'szedjem ki', tároljam az adatokat és jelenítsem meg a fát. Érdemes-e bárhol is tömböt, fájlt használni adattárolásra, vagy mindig futtasak lekérdezést egy-egy elem viszgálatához?

Megjegyezném, hogy az alap motor már működik, tehát nem konkrét megoldást várok, hanem egy olyat ami ilyen nagyméretű adathalmaz esetén is (amit sajnos eddig figyelmen kívül hagytam) gyorsan működik. Köszönöm!
3

Hierarchikus adatkezelés

Poetro · 2010. Júl. 6. (K), 20.43
Talán nem jó az adatstruktúrád, érdemes lenne átnézni az erről szóló cikksorozatot.
4

LDAP

janoszen · 2010. Júl. 6. (K), 22.14
Esetleg tárold az adatokat LDAP-ban az ugyanis pont ilyesmire van kitalálva.
6

Ahogy nézem, az LDAP tényleg

mahoo · 2010. Júl. 7. (Sze), 10.55
Ahogy nézem, az LDAP tényleg erről szól! Csak számomra ez egy teljesen új dolog és valószínűleg a szűk határidő miatt nem tudom ezt használni, de nagyon köszi az infot!
5

Átfutottam rajtuk, a második

mahoo · 2010. Júl. 7. (Sze), 10.49
Átfutottam rajtuk, a második cikk asszem ami számomra megoldást jelenthet. Lehet, hogy még betámadok 1-2 kérdéssel. Köszönöm!
7

Sziasztok, sokat segített a

mahoo · 2010. Júl. 11. (V), 20.35
Sziasztok, sokat segített a cikk és nagyjából már működik is a program :).

De... szerintetek a 'nested tree' ad-e lehetőséget arra, hogy a jobb és bal értékek alapján megmondjam egy elemről, hogy az a struktúrán belül egy adott szinten annak 'szélén' helyezkedik-e el vagy sem?

link

Tehát a 'Yellow'-ról mégléphetek balra (red) és jobbra (beef) is, de a 'red'-ról csak jobb, balra nem!
Nekem nem sikerült kitalálnom, de hát nem is vagyok olyan bölcs :).
8

Testvérek

Poetro · 2010. Júl. 11. (V), 21.00
Lekérdezed az elem testvéreit, és aminek minimális a bal értéke, az van a bal szélen, aminek maximális a jobb értéke, az van a jobb szélen.
9

Ha jól értem, ha tudom egy

mahoo · 2010. Júl. 11. (V), 21.21
Ha jól értem, ha tudom egy elem szintjét, abból le tudom kérdezni a testvéreket, azaz az azonos szinten lévőket. És ha a lekérdezett elem balja kisebb mind az ID elem balja, akkor még tudok balra lépni, illetve a legkisebb bal értékű pedig jelenti majd a stuktúra szélét.

Ha Te is erre gondoltál, akkor jó mert én is, csak az előző kérdésemből hagytam ki egy lényeges dolgot. Valójában az érdekelt volna, hogy valamiféle számítással, ha tudom egy elem szintjét, balját, jobbját, stb. meg tudom e mondani, hogy az szélső elem e vagy sem. Tehát olyan képlet érdekelt volna mint a 'gyermekek száma' például. Mert ez nem kíván újabb lekérdezést és ezáltal gyorsabb a működés.

Szóval bocsánat a pontatlan fogalmazásért, és ha nincs ilyen képlet, akkor használom majd az előbb említetteket.

Köszi mégegyszer!
10

Testvérek

Poetro · 2010. Júl. 11. (V), 21.47
Egy elem testvérei ugye a szülőjének a gyermekei, azaz nincs szükség az elem szintjére, elég lekérdezni az elem szülőjét, és annak gyermekeit. Az elem szülőjének lekérdezését megtalálod a pathTo függvényben.
11

Nem tudom, lehet, hogy félre

mahoo · 2010. Júl. 12. (H), 08.55
Nem tudom, lehet, hogy félre értjük egymást, de nekem erre lenne szükségem:

link

És itt szerintem fontos a szint (pirossal határolt területek), mert azon belül kell megvalósítanom a jobbra-balra lépkedést, addig amig van oldasó tag, testvér.