Sziasztok!
Szerintetek melyik a gyorsabb?
SELECT count(mezonev) FROM tablanev WHERE mezonev = 123;
vagy
SELECT count(*) FROM tablanev WHERE mezonev = 123;
Próbálnám gyorsítani és optimalizálni a dolgokat, de ha konzolon nézem egy 20000 rekordot tartalmazó táblán, mind a kettő ugyanazt az időeredményt adja.(0.04 sec)
De fontos lenne, hogy a gyorsabb(optimálisabb) verziót válasszam, mert elég sokszor hajtódik végre a lekérdezés.
Előre is köszi a válaszokat.
- 6112 megtekintés
Hozzászólások
Legalább mondj egy RDBMS típust és verziót. A régi MYSQL (3,23) Az első verzió esetén gyorsabb volt valamivel.
- A hozzászóláshoz be kell jelentkezni
5.1-es mysql van most a szerveren
- A hozzászóláshoz be kell jelentkezni
ez egy jó kis cikk :-)
köszönöm!
- A hozzászóláshoz be kell jelentkezni
szerintem
SELECT SUM(1) FROM tablanev WHERE mezonev = 123;
- A hozzászóláshoz be kell jelentkezni
ez sem rossz megoldás, de vajon gyorsabb ?
- A hozzászóláshoz be kell jelentkezni
biztos, mert nem vacakol mezőkkel, adatokkal, referenciákkal stb., csak konstans szerepel benne.
Egyébként meg méréshez (pl php-ben, de írhatod bármi másban is):
$start=microtime(true);
mysql_query(...);
$end=microtime(true);
echo($end-$start)."μsec");
Persze érdemes többször futtatni, és kiátlagolni a mérési eredményeket.
- A hozzászóláshoz be kell jelentkezni
A select count(*) sem vacakol semmilyen adattal, csak pörgeti a számlálót, mint a select sum(1) - sőt a count(*) helyből ésszerű elérési tervvel szok összedrótozva lenni.
...
Megnéztem DB2-n, 3.75m-s táblán - nem szignifikánsan lassabb a sum(1).
- A hozzászóláshoz be kell jelentkezni
Eddig senki sem tette meg, úgyhogy referálom a doksit:
http://dev.mysql.com/doc/refman/5.1/en/group-by-functions.html#function…
- A hozzászóláshoz be kell jelentkezni
Query plan-t nem lehet valahogy megnézni? Abból látszik, hogy milyen műveleteket fog csinálni az adatbázis-kezelő.
A futásidő mérés felbontásának pontosságát növelni módszerek:
* Mindenképpen mérj annyi adaton, amennyi az adatbázisban éles üzemben lesz. Meg egy kicsit többön is. Mágikus határok átlépésekor nagyon meg tud változni a válaszidő.
20000 kevésnek tűnik.
* Még ha nem is lesz annyi adatod soha, akkor is növeld a teszt adatbázis méretét addig, hogy a mérési hiba kicsi legyen a mért értékhez képest.
* Meg lehet próbálni a válaszidő helyett a szerver processz CPU felhasználását monitorozni. Írj programot, ami egyszerre sok kérést indít, és azzal mérj. A CPU használat görbét nézd (illetve ha nem fér memóriába az adatbázis, akkor a diszk IO-t is)! Életszerűbb teszt, mint egyetlen futás eredménye.
- A hozzászóláshoz be kell jelentkezni
0., Mivel idempotens művelet: futtasd le 10.000x mindkettőt egy szimpla for ciklusban (lehetőleg SQL_NO_CACHE-el;)
- A hozzászóláshoz be kell jelentkezni
Nem tudom mennyire lesz statikus a query/tábla,
de esetleg eltárolni minden mezonev-re az eredményt, és onnan lekérdzni?
- A hozzászóláshoz be kell jelentkezni
Mivel a MyISAM nem tranzakciós, tárolja a sorok számát, így a count(*) azt olvassa ki). Ha a mezőnév PK, akkor ugyanez, ha sima index, akkor az index számosságát adja vissza.
INNODb meg index számosságot vagy table scant eredményez, ha jol emlekszem.
Ha szűrsz is (mint most teszed), akkor ha a mezonev indexelt, akkor azt szamolja, amugy meg teljes szortirozas utan megszamolja mennyi sor maradt.
(Próbáld ki, pármillió sorral pl.)
Igy a problemad eltolodott COUNT() optimalizalasrol helyes indexkezelesre.
- A hozzászóláshoz be kell jelentkezni
SQL_CALC_FOUND_ROWS found_rows()-val?
SELECT SQL_CALC_FOUND_ROWS mezonev FROM tablanev WHERE mezonev = 123;
select found_rows() as darab;
- A hozzászóláshoz be kell jelentkezni
limit....
t
- A hozzászóláshoz be kell jelentkezni
Mivel 0.04 a futasi ido szerintem tul keves adatod van, hogy ossze tudd hasonlitani.
Ha a mezonev nem lehet NULL, akkor ugy tudom, hogy mind a ketto ugyanannyi ido alatt fut le.
Ha mezonev lehet NULL, akkor a ket eredmeny nem biztos, hogy egyenlo, ugyhogy attol fugg, hogy melyik ertek erdekel.
Ha csak a sorok szama erdekel, akkor a SQL_CALC_FOUND_ROWS-os modszer pocseklas szerintem, mert kiszedi neked a mezonev oszlopot, foloslegesen.
Ezenkivul vigyazz meresekkor a mysql query cache-re, a masodik futtataskor jo esellyel (ha nem modosult a tablanev tabla) nem futtatja le a query-t, hanem kiveszi a cache-bol az eredmenyt. Ugyhogy az 123-t minden futtataskor csereld mas ertekre.
- A hozzászóláshoz be kell jelentkezni
There are only 2 kinds of SQL developers:
* Those who know how COUNT() treats NULLs
* Those who don't
* Those who don't care
--
There are free things in life i'll never understand
Spelling and counting
- A hozzászóláshoz be kell jelentkezni
:)
- A hozzászóláshoz be kell jelentkezni
És aki elolvassa a doksit: http://dev.mysql.com/doc/refman/5.1/en/group-by-functions.html#function…
Várj, az az első fajta :-)
- A hozzászóláshoz be kell jelentkezni
köszönöm a segítséget, a doksi, válaszok és tesztek alapján mivel a tábla myisam típusú így maradok a második verziónál... ha változtatok újragondolom a dolgokat..
- A hozzászóláshoz be kell jelentkezni