Kirjassa oli esimerkki, jos haluaa jakaa pitkä listan tietoa monelle sivulle, ja laittaa sivun alalaitaan linkit jokaiselle sivulle tyyliin:
Niin sitä varteen sama SQL query suoritetaan 2 kertaa, ensin lasketaan kaikki rivit, jotta tietäisimme montako sivua tulee, ja sen jälkeen suoritetaan sama query, muta LIMIT arvoilla, ja haetaan yhden sivun tiedot.
Joten onko tällainen järkevää, jos kysely, joka hakee nämä tiedot on aika raskas? Toisaalta voiko saman kyselyn suorittaminen kaksi kertaa peräkkäin olla hidasta, kun se todennäköisesti jää johonkin puskuriin?
Vai kannattaisiko kuitenkin laittaa sivuille vain linkit, ilman sivunumeroita, kun tätä varteen ei tarvita kahta kyselyä.
Niin sitä varteen sama SQL query suoritetaan 2 kertaa, ensin lasketaan kaikki rivit, jotta tietäisimme montako sivua tulee, ja sen jälkeen suoritetaan sama query, muta LIMIT arvoilla, ja haetaan yhden sivun tiedot.
Joten onko tällainen järkevää, jos kysely, joka hakee nämä tiedot on aika raskas? Toisaalta voiko saman kyselyn suorittaminen kaksi kertaa peräkkäin olla hidasta, kun se todennäköisesti jää johonkin puskuriin?
Vai kannattaisiko kuitenkin laittaa sivuille vain linkit, ilman sivunumeroita, kun tätä varteen ei tarvita kahta kyselyä.
Vastaukset 1
Vanhimmat
*Niin sitä varteen sama SQL query suoritetaan 2 kertaa, ensin lasketaan kaikki rivit, jotta tietäisimme montako sivua tulee, ja sen jälkeen suoritetaan sama query, muta LIMIT arvoilla, ja haetaan yhden sivun tiedot.*
Ei todellakaan noin. Liikutat taulusta kaikki datan ja ilmeisesti katsot mysql_num_rows avulla paljon rivejä palauttaa ja tämän jälkeen haet vain vaikkapa 30 viestiä.
Toki tuo toimii jos taulun koko pieni, mutta jos taulun koko kasvaa niin MySQL serverin ja PHP-tulkin välillä liikennettä tulee paljon jolloin sivusi hidastuu hidastumistaan. En tosin ole varma toimiiko MySQL hieman toisin, hakee kaikki datan ja sitten kertoo PHP:lle pelkän rivimäärän mysql_num_rows käytettäessä. Ihan sama melkein yhtähuono juttu.
Tee tämmöinen kysely joka on todella kevyt ja nopea todella suurilla tietomäärilläkin, pelkkä rivimäärä haetaan suoraan indeksist.
SELECT COUNT(*) FROM taulu LIMIT 1
ja sitten vaik
SELECT viesti,kirjoittaja FROM taulu LIMIT 0,30
*Toisaalta voiko saman kyselyn suorittaminen kaksi kertaa peräkkäin olla hidasta, kun se todennäköisesti jää johonkin puskuriin?*
Kyllä voi olla hidasta jos kysely tuo turhaa dataa tai on muutoin huonosti suunniteltu jne... Totta se että kyselyt yleensä tallenetaan tietokannan muistiin jolloin seuraava sama kysely on paljon nopeempa (riippuu tietokanta palvelimen asetuksist). Mutta kahta tai useampaakaan samaa kyselyä ei ole järkevää tehdä. Miksi hakea data uudestaan jos sinulla se jo on?
*Vai kannattaisiko kuitenkin laittaa sivuille vain linkit, ilman sivunumeroita, kun tätä varteen ei tarvita kahta kyselyä.*
Laita se kumpa sinua enempi miellyttää. Tosin suosittelen, että jos päädyt vain edellinen ja seuraava linkkeihin niin silti käytät kahta kyselyä. Ettei tule semmoista tilannetta, että olet esim ekalla sivulla ja silti voit klikata edellinen.
Turhaan huolestut kahdesta tietokanta kyselystä varsinkin kun on kevyitä ja pikkuruisia, eikä mitään monimutkasia liitoksia alikyselyineen. Esim perus foorumi softat tekee 3-8 kyselyä sivua kohti. Yleensä tietokanta yhteyden luominen kestää kauemmin kuin itse kyselyjen suorittaminen.
Tärkeintähän on, että sinulla on taulu indeksoitu ja suunniteltu kunnolla sekä kyselyt on kunnollisia. Sekä yleissääntönä hae vain se data mitä tarttet etkä yhtään enempää.