Pastaruoju metu keliems žmonėms iškilo tas pats klausimas – ką naudoti, SQL_CALC_FOUND_ROWS ar SELECT+COUNT, kai daromas elementarus puslapiavimas. Todėl trumpai apžvelgsiu jų abiejų veikimo principus ir patarsiu, ką kada verčiau naudoti.
SQL_CALC_FOUND_ROWS (SCFR toliau) yra SELECT'o dalis, kuri nurodo mysql'ui, kad reikia suskaičiuoti, kiek iš viso yra užklausą atitinkančių rezultatų, nežiūrint į LIMIT. Pvz.: SELECT SQL_CALC_FOUND_ROWS * FROM `articles` WHERE `author_id` = '55' LIMIT 5. Ši užklausa grąžins pirmuosius penkis rezultatus. Kita užklausa – FOUND_ROWS() – mes paimame kiekį rezultatų, kuriuos grąžintų užklausa be LIMIT.
„Rankinis“ būdas gauti tiems patiems duomenims būtų toks: SELECT'as – toks kaip pirmasis, tik be SQL_CALC_FOUND_ROWS, ir kita užklausa – SELECT * FROM `articles` WHERE `author_id` = '55'.
Viskas su SCFR atrodytų labai gražu. Mums nereikia papildomai formuoti ir vykdyti užklausos, mysql'as tuo pasirūpina pats. Tačiau čia prasideda problemos. Pagrindinė yra ta, kad naudojant SCFR visada naudojamas file sort'as. Tai reiškia, kad einama per visą lentelę, nors to dažniausiai net nereikia. Jeigu naudojama lentelė yra tvarkingai suindeksuota (mūsų atveju indeksas turėtų būti ant `author_id` stulpelio), antras būdas su dviem užklausomis visada veiks greičiau (ar bent jau ne lėčiau) negu pirmasis. MySQL 5.2+ versijoje SCFR turėtų būti šiek tiek optimizuotas, tačiau kol kas turime tai, ką turime.
Žinoma, yra ir kita pusė. InnoDb SCFR veikia žymiai greičiau, nei MyISAM'e, todėl kartais galimas kompromisas: paaukoti šiek tiek performance'o vardan mažiau kompleksijos aplikacijoje, ypač ilgose ir sudėtingose užklausose. Be to, kai kuriose užklausose būtinai turi būti naudojamas filesort'as. Tokiu atveju SCRF veiks greičiau negu dvi užklausos, nes visi duomenys jau bus suskaičiuoti iš karto.
Reziume: visose standartinėse situacijose naudojame dvi užklausas – SELECT+COUNT. Likusiose – bandymai ir praktinis geriausio varianto parinkimas.
|