PHP + PostgreSQL

Van egy kis webes alkalmazasom ami postgresbol dolgozik. Nem vagyok elegedett a sebessegevel, szeretnek gyorsitani rajta. Most valami ilyesmi van benne amit szeretnel leroviditeni:


select * from table where....;

ami vegigturja az egesz DB-t, de aztan vegul csak az elso 100 (vagy valahany) talalat jelenik meg a bongeszoben. Szoval eleg lenne valami ilyesmi is:


select * from table where.... limit 100;

Ez sokat segit, viszont igy nem tudom kiirni, hogy a teljes adatbazisban hany talalat van! Pedig azt is szeretnem megjeleniteni (most meg is jelenitem). Persze megtehetnem, hogy ezutan meg futtatok egy "select count(*)..."-ot, de akkor nem nyertem semmit, hiszen at kell turni az egesz DB-t (reszben ujra).

Ket megoldas jutott az eszembe... vagyis egyik se megoldas meg, mert nem tudom, hogy lehetne oket megcsinalni, ha egyaltalan...

a) a PHP

pg_query

fuggvenye olyan, hogy nem ter vissza ameg a teljes select le nem futott. Nem lehetne valahogy a mar kikeresett rekordokat visszakapni (mondjuk a sorrend nem szamit) mikozben a select meg fut? Ettol a DB keres ugyan nem lenne gyorsabb, de a weben hamarabb latszana az eredmeny.

b) a

...limit 100

-as megoldas is jo lenne onmagaban, ha lehetne tudni, hogy a limit 100 elereseig a tablanak mekkora reszet kellett atnezni es ebbol megbecsulni, hogy az egesz DB-ben hany talalat lett volna (pontossag nem fontos). Vagyis ha az "alma"-ra keresek, amire a DB elso 2%-anak atnyalazasabol osszejon a 100 talalt, ott a limit leall, en meg ezt az eredmenyt felszorozva irnam ki, hogy hany alma van a teljes DB-ben. Le lehet valahogy kerdezni, hogy hol jart a select mikor a limit-hez ert? mOndjuk mi az utolso rekord sorszama?

Hozzászólások

javaslom , hogy a keresési mezőkre indexeld le a tábládat, illetve a select count(*) helyett SELECT Count(indexeltmező) -t használj. Ez már alapvetően sokat fog gyorsítani az oldaladon.

-1
indexek vannak (amire lehet), count(*)-ot meg egyaltalan nem hasznalok. "select *..." szeru dolgok vannak amibol a php tudja azt is hogy hany rekordot kapott, szoval nem kell a count(*) ha mar ugyis megvolt a lekerdezes.

a limit meg jo lenne... de pont az a baj, hogy azt nem tudom hasznalni... (lasd fonn)

Mennyire változik a lekérdezés? mert ha nem nagyon, akkor az új sor beillesztésekor elmented egy külön táblába a sorok számát, s akkor csak azt kell lekérdezned, nem az egész db-t. Ez mondjuk nyilván limitált számú típuslekérdezésig jó megoldás.

Az indexekrol (ha mar felvetodott) meg egy kicsit:
Az (is) a baj, hogy az egyik mezon szabad szavas kereses van, amin nemigen hasznal az index. Ha ez nem lenne, akkor -gondolom- nagysagrendeket is gyorsulhatna a kereses.
(Es mielott ez is felvetodne: a select where-je ugy van osszerakva, hogy a like "%alma%" tipusu feltetel az utolso legyen, ugyhogy a jol indexelheto mezok mar szurnek korabban.)

SQL_CALC_FOUND_ROWS egy erv h valts MySql -re :)
Bocs, de annyira idekivankozott!

Otletem csak annyi lenne, hogy esetleg valami tarolt eljaras v. fuggveny csinalna a lekerdezest limit nelkul. Az osszeszamolna a talalatok szamat valtozoba mentene, majd visszaadna a limitalt result set -et. Egy ujabb lekressel meg lekerned a valtozo erteket. Ebben az lenne a jo, h egyfelol nem kell ketszer lefutatni ugyan azt a kerest 8limittel es nelkule), masfelol nem kell atpaszirozni a php -nak a full result setet es aztan ott buveszkedni vele, igy az egesz db oldalon futna ezert viszonylag gyors lenne. Vagy ez hulyeseg? :D