Kezdőoldal » Számítástechnika » Programozás » Érdemes-e indexelni egy...

Érdemes-e indexelni egy TimeStamp MySQL oszlopot, ha az az egyetlen oszlop?

Figyelt kérdés

Egy számlálón dolgozom, ami bizonyos eseményeket (forgalomszámlálás) számlál, a kritériumok (személyautó, teherautó stb.) és a versengés is kezeltek.


Az eseményeket (elhalad az autó) rögzítem a táblákba a kritériumok (személyautó, teherautó stb.) szerint, az egyetlen oszlop TimeStamp típusú, és ide kerül bele az esemény ideje. Később bármilyen időintervallumra tudnom kell szűrni, ezért nem használhatok sima számlálót.


Most épp töltöm fel az adatbázist néhány millió random tesztadattal, de nem tudom, hogy mi lenne a teljesítmény szempontjából a legjobb. Ha indexelném az oszlopot, vagy ha nem? Még talán sosem csináltam ilyet, de nem használok elsődleges kulcsot, mert jelen esetben nem látom semmi értelmét. Jól látom, ha nem látom?


Persze, ki fogom próbálni így is, meg úgy is, de lehet, hogy van az egésznek valami elméleti háttere, ami elkerüli a figyelmemet?



2016. máj. 14. 20:08
 1/4 anonim ***** válasza:
100%

> Érdemes-e indexelni egy TimeStamp MySQL oszlopot, ha az az egyetlen oszlop?


Az az egyetlen oszlop? Akkor már a táblának sincs a világon semmi értelme, nem hogy még indexelgetni azt az árva oszlopot. :)


Ha eltekintek az "az az egyetlen oszlop" kifejezéstől a szövegedben, kihámozom, hogy van még legalább 2 oszlopod:

> Az eseményeket (elhalad az autó) rögzítem a táblákba a kritériumok (személyautó, teherautó stb.) szerint


> Ha indexelném az oszlopot, vagy ha nem? Még talán sosem csináltam ilyet, de nem használok elsődleges kulcsot


Azt kéne eldönteni, hogyan fogod használni később a táblát. Mi alapján fogsz benne keresni? Hogyan fogod azonosítani a rekordokat (pl. szerkesztéshez), ha nincs ID? Vagy nem akarsz vele semmit csinálni, csak belehányod az adatokat (akár redundánsan is), később meg csak egyben kilistázod valahol? Akkor meg egyáltalán minek az adatbázis, egy sima log fájl is pontosan ezt tudja.


A sémát is leírhatnád esetleg, hogy egyértelmű dolgokról tudjunk értekezni.


A kérdésektől függetlenül egyébként az adatok betöltése nyilván index nélkül lesz gyorsabb (akár betöltés előtt törölhető, aztán visszarakható). A betöltés módszerének a bulk INSERT az ajánlás általában, de még jobban jársz ha LOAD DATA-val töltöd be, az nagyságrendeket javít a betöltési időn.

2016. máj. 14. 22:08
Hasznos számodra ez a válasz?
 2/4 A kérdező kommentje:

Köszi a gyors és segítő választ, és az iránymutatást!


Nem vagyok benne teljesen biztos, hogy jól ragadtam meg a probléma lényegét, pláne az ismertetését. :)


Szóval a lényeg, hogy nincs szükségem másra, csak az időpontra, hogy az adott esemény (jármű elhaladása) mikor következett be. A különböző fajtájú eseményeket (személygépkocsi, tehergépkocsi) külön-külön táblában tárolom, azonos struktúrával, azaz egyetlen TimeStamp mezővel. Lehetne egybe is, és akkor egy táblában több mező lenne, de nem hinném, hogy ez lényegét tekintve változtatna a problémámon.


Nincs semmi szükségem arra, hogy a rekordokat később módosítsam, valójában még listázásukra sincs szükség. Ami kell, hogy egy SQL lekérdezésben /kb. SELECT COUNT(*) FROM Table WHERE (Table.TimeStamp>=x) AND (Table.TimeStamp<=y)/ megszámolhassam, hogy az adott időintervallumban hány esemény történt. És az időintervallum az, ami szabadon választható: 1 perc, 1 óra, 1 nap, 1 hét, 1 hónap, 1 év stb. és persze ezek ésszerű kombinációi. :)


A feltöltést - valamelyik adatbázistábla írását - egy esemény (elhaladó jármű) váltja ki, ezt egy sima INSERT-tel oldom meg, beszúrja a tábla végére a rekordot. Ez a séma, pofon egyszerű, a sebessége több, mint kielégítő, persze index használata nélkül.


Valójában azért kell adatbázis, mert több lekérdező (_csak_és_kizárólag_ lekérdező) kliens egyidejű kiszolgálása az igény, ezt pedig nem - vagyis sokkal nehezebben - tudom megoldani egy log fájllal. :)

2016. máj. 14. 23:05
 3/4 anonim ***** válasza:
Egyetlen lényegi kérdés van: Szükség van arra, hogy a később egy-egy eseményt be tudj azonosítani, hogy a timestamp-eket hozzá tudd rendelni egy másik tábla bizonyos értékeihez? Ha nincs, és tényleg csak összegző lekérdezéseket akarsz csinálni, úgy valóban nem indokolt az indexelés.
2016. máj. 15. 02:12
Hasznos számodra ez a válasz?
 4/4 A kérdező kommentje:

Hálás köszönet neked is, #3-as!


Az egyetlen, amire szükségem van - ahogyan az eredeti kérdésben is írtam - "hogy mi lenne a teljesítmény szempontjából a legjobb".


Azóta már végeztem teszteket, nagyon meglepő eredmények születtek!


A SELECT COUNT(*) FROM Table WHERE (Table.TimeStamp>=x) AND (Table.TimeStamp<=y) lekérdezést a 2 db 1.000.000+ soros táblán cache nélkül sokszor (egy kis programkódhiba miatt 144-szer 12-szer helyett, de így szerencsére jobban is kijött a különbség), eltérő paraméterekkel az alábbi időeredmények születtek:


Nincs index és nincs primary key: 3 perc 24 másodperc

Van index, de nincs primary key: 20 másodperc

Van index és van primary key: 14 másodperc


Tehát az eddigi tesztjeim szerint jót tesz a lekérdezésnek, ha van index és van elsődleges kulcs, ez mintegy 14.5x-es sebességnövekedést eredményezhet.


A hibás programkód korrigálásával a 14 másodperc kb. 1 másodpercre csökkent.


Lehet-e valamilyen módon tovább javítani a lekérdezés sebességét?


Szerencsére az index és az elsődleges kulcs az új rekord beszúrásának sebességét nem rontotta le számottevően, kb. 550-600/sec a jelenlegi felviteli sebesség, ami bőven elfogadható.

2016. máj. 15. 18:03

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!