Topic: Viena uzklausa be LIMIT ar dvi uzklausos su LIMIT?

Sveiki, norejau paklausti kas greiciau veiks ir ka geriau naudoti:

UPDATE `table1` LEFT JOIN `table2` ON `table1`.`id1`=`table2`.`id2` SET `table1`.`field_a`='1', `table2`.`field_b`='2' WHERE `table1`.`id1`='1' AND `table2`.`id2`='1';

ar

UPDATE `table1` SET `field_a`='1' WHERE `id1`='1' LIMIT 1;
UPDATE `table2` SET `field_b`='1' WHERE `id2`='1' LIMIT 1;

Suprantu, kad pirmu variantu naudojama tik viena uzklausa, o ne dvi, bet tuomet negaliu naudoti LIMIT 1 ir man atrodo, kad yra perziurimi visi irasai lentelese ir atnaujinamas tik vienas.
Antru atveju, yra atliekamos dvi uzklausos, bet kai vienas irasas atnaujinamas, darbas sustoja.

Re: Viena uzklausa be LIMIT ar dvi uzklausos su LIMIT?

Tiek pirmu tiek antru atveju yra analizuojamos abi lentelės.

Papildoma užklausa čia tikriausiai mažiausiai prideda "greičio" ar "lėtumo".

LIMIT 1, reiškia, kad vykdymas nutraukiamas po pirmo updeito.

O dėl palyginimo, tai papraščiausiai išbandyk, vien iš užklausų niekas neaišku žiūrint iš šono... jau vien matant, kad ID pas tave kažkodėl yra 'string' tipo.

Re: Viena uzklausa be LIMIT ar dvi uzklausos su LIMIT?

ID yra INT tipo indeksas. Didele beda jeigu i kabutes dedu `id`='$int'?

Re: Viena uzklausa be LIMIT ar dvi uzklausos su LIMIT?

Jeigu dedi INT tipo stulpelio reikšmę į kabutes, tai:
1) painioji tuos, kurie skaito/mato kodą ir galvoja, kad ten ne INT tipas;
2) verti mysql serverį papildomai atlikti konversiją iš STRING tipo į INT tipą;

Re: Viena uzklausa be LIMIT ar dvi uzklausos su LIMIT?

minde wrote:

2) verti mysql serverį papildomai atlikti konversiją iš STRING tipo į INT tipą;

Ir tai reikalauja net 0.001% serverio pajegumo :)

Re: Viena uzklausa be LIMIT ar dvi uzklausos su LIMIT?

Ajaks wrote:
minde wrote:

2) verti mysql serverį papildomai atlikti konversiją iš STRING tipo į INT tipą;

Ir tai reikalauja net 0.001% serverio pajegumo :)

Teisingas požiūris. Lai dirba tie kompiuteriai :D Ypač kai tau jokio skirtumo kaip įvesti.

MongoDB Certified Developer
MongoDB Certified DBA
Zend Certified Engineer

Re: Viena uzklausa be LIMIT ar dvi uzklausos su LIMIT?

Tai galima parasyti vienu zodziu maziau teksto output'e ir bus tas pats procesoriaus energijos sutaupymas.... :)

Teisingas poziuris yra sanaudos in -> rezultatas out. Ir kiek uz sanaudas gauni rezultato. Jeigu gauni labai mazai, neverta gaisti laiko apkraunant automatini SQL generavima ir papildomu if'u kisima (:)

Re: Viena uzklausa be LIMIT ar dvi uzklausos su LIMIT?

Ajaks, nežinau ką čia iš tikro nori išvedžioti. Skirtingo ilgio teksto išvedimas ir STRING konvertavimas į INT nėra tolygūs dalykai. Aš nesakau, kad konversija yra nežmoniškai brangi. Bet jeigu gali neišvedinėti bereikalingo teksto - neišvedinėk. Jeigu gali išvengti bereikalingos operacijos - išvenk.

SQL užklausos yra linkusios būti vykdomos šimtus, tūkstančius ir milijonus kartų. Projektuose skirtingų užklausų dažniausiai yra nuo kelių iki keliasdešimt kiekvieno puslapio užkrovimo metu. Papasakok facebook ar google inžinieriams, kur sutaupyti tūkstantąją serverio apkrovimo dalį vienos užklausos vykdymo metu ir jie tau tikrai pasakys daugiau negu ačiū (-;

Dėl bendro sąnaudų-rezultato skaičiavimo aš iš principo sutinku, bet šiuo atveju tas negalioja, nes sąnaudos ar parašyti 1 ar '1' yra vienodos.

čia tos kabutės yra tik šiaip, bendras pastebėjimas prie kur kas svarbesnių dalykų.

Re: Viena uzklausa be LIMIT ar dvi uzklausos su LIMIT?

minde wrote:

Ajaks, nežinau ką čia iš tikro nori išvedžioti. Skirtingo ilgio teksto išvedimas ir STRING konvertavimas į INT nėra tolygūs dalykai. Aš nesakau, kad konversija yra nežmoniškai brangi. Bet jeigu gali neišvedinėti bereikalingo teksto - neišvedinėk. Jeigu gali išvengti bereikalingos operacijos - išvenk.

SQL užklausos yra linkusios būti vykdomos šimtus, tūkstančius ir milijonus kartų. Projektuose skirtingų užklausų dažniausiai yra nuo kelių iki keliasdešimt kiekvieno puslapio užkrovimo metu. Papasakok facebook ar google inžinieriams, kur sutaupyti tūkstantąją serverio apkrovimo dalį vienos užklausos vykdymo metu ir jie tau tikrai pasakys daugiau negu ačiū (-;

Dėl bendro sąnaudų-rezultato skaičiavimo aš iš principo sutinku, bet šiuo atveju tas negalioja, nes sąnaudos ar parašyti 1 ar '1' yra vienodos.

čia tos kabutės yra tik šiaip, bendras pastebėjimas prie kur kas svarbesnių dalykų.

Jeigu nezinai tai paaiskinsiu: tavo pasakyme "Jeigu gali išvengti bereikalingos operacijos - išvenk" truksta vieno dalyko: Kiek tai kainuos. Esminio dalyko kurio daugelis nesuvokia ir uzsisuka i nezmoniska optimizavima, nezinia kiek laiko ir uz nezinia kokius pinigus. Uzsisuka tiek kad eda babkes ir neduoda atitinkamos naudos.

Kitaip tariant nereikia uzsiimti perdetu optimizavimu. Ir mes apie feisbukus nekalbam nes nei tau nei man tas negresia.

Re: Viena uzklausa be LIMIT ar dvi uzklausos su LIMIT?

Kalbam ne apie perdėtą optimizavimą. Kalbam apie tai kad iš karto rašyti teisingai ir kad niekam pažiūrėjus į kodą nekiltu kažkokių klausimų, kaip kad dabar. Aš ne šiaip sau čia paklausiau/parašiau, o todėl, kad ne kartą esu matęs ID laukus iš VARCHAR(255), kur realiai naudojamas INT'as. Ir čia nieko nuostabaus, gal ir pats kažkada senai taip dariau. šiuo atveju netgi ir svarbesnis punktas, kad kažkas ne taip kažką interpretuos ir papildomai gaiš laiką ten, kur nereikia.

Re: Viena uzklausa be LIMIT ar dvi uzklausos su LIMIT?

Ir kiek gi kainuoja nuimti kabutes? Iš karto rašant tvarkingai nereiks papildomai mokėti, kad kažkas papildomai optimizuotų kodą.

Požiūris yra esminis dalykas, jei px tai tikrai apie jokius facebook'us ar kokius kitus rimtus dalykus galima net negalvoti.

MongoDB Certified Developer
MongoDB Certified DBA
Zend Certified Engineer

12 (edited by Neodan 2013-02-27 13:48:06)

Re: Viena uzklausa be LIMIT ar dvi uzklausos su LIMIT?

Ajaks, susidaro toks vaizdas, kad pagal tave galima rašyti kodą belekaip (nesilaikant standartų ir rekomendacijų). Nors realiai tvarkingas kodo rašymas neatima papildomo laiko, bet gerokai pagerina kodo skaitomumą ir sumažina nesąmonių tikimybę (-;

P.S. tokiu atveju MySQL ir indeksu galima nenaudoti, nes galingas serveris su daugumos paprastu puslapių db ir be indeksu gan normaliai susitvarkys. :)

13 (edited by Ajaks 2013-02-27 13:56:57)

Re: Viena uzklausa be LIMIT ar dvi uzklausos su LIMIT?

minde wrote:

Kalbam ne apie perdėtą optimizavimą. Kalbam apie tai kad iš karto rašyti teisingai ir kad niekam pažiūrėjus į kodą nekiltu kažkokių klausimų, kaip kad dabar. Aš ne šiaip sau čia paklausiau/parašiau, o todėl, kad ne kartą esu matęs ID laukus iš VARCHAR(255), kur realiai naudojamas INT'as. Ir čia nieko nuostabaus, gal ir pats kažkada senai taip dariau. šiuo atveju netgi ir svarbesnis punktas, kad kažkas ne taip kažką interpretuos ir papildomai gaiš laiką ten, kur nereikia.

Siuo atveju mes kalbam ne apie varchar 255 o apie tai kas daugiau kainuos: ar kabuciu nerasymas ar ju rasymas ir leisti sistemai atsirinkti.

Yra du variantai: saitas mazas ir viskas daroma rankiniu budu arba saitas didelis ir sql generuojama automatiskai. Jeigu saitas mazas, tai gali rasyti, gali nerasyti tu kabuciu, greiciui realios itakos tai netures. Jeigu saitas didelis, ir daromos automatines sql query, tada turi papildomai rasyti patikrinima kokiam nors php lygyje kad suzinoti koks tipas ir tada arba jas deti arba nedeti. Visas tas patikrinimas ir salygu sukurimas kainuos daugiau negu leisti kokiam mysql lygyje sistemai paciai prisitaikyti.

Re: Viena uzklausa be LIMIT ar dvi uzklausos su LIMIT?

zygis wrote:

Ir kiek gi kainuoja nuimti kabutes? Iš karto rašant tvarkingai nereiks papildomai mokėti, kad kažkas papildomai optimizuotų kodą.

Požiūris yra esminis dalykas, jei px tai tikrai apie jokius facebook'us ar kokius kitus rimtus dalykus galima net negalvoti.

skaityk auksciau. Kaina - tai ne tik rasymas bet ir procesoriaus kaina.

Re: Viena uzklausa be LIMIT ar dvi uzklausos su LIMIT?

Totali netiesa, normalūs query builderiai nuskaito lentelės stulpelius su tipais ir tinkamai viską sudėlioja. Duomenys apie stulpelius ir tipus - kešuojami.

MongoDB Certified Developer
MongoDB Certified DBA
Zend Certified Engineer

Re: Viena uzklausa be LIMIT ar dvi uzklausos su LIMIT?

zygis wrote:

Totali netiesa, normalūs query builderiai nuskaito lentelės stulpelius su tipais ir tinkamai viską sudėlioja. Duomenys apie stulpelius ir tipus - kešuojami.

'Normalus query builderiai'...ople, ura! Tai kam tada isviso vargti, jeigu yra 'normalus query builderiai' kurie viska padaro ir visiems viskas dzin. Neverta net sita tema kalbeti.

17 (edited by qwertyuiop 2013-02-27 14:32:42)

Re: Viena uzklausa be LIMIT ar dvi uzklausos su LIMIT?

Labai dekui del kabuciu. As galvojau, kad jas turiu naudoti del saugumo, na, bet dabar pagalvojus, tai beprasmiska jas buvo rasyti.

$id=intval($id); WHERE `id`=$id

vistiek PHP pagalba uztikrinu, kad $id bus skaicius.

O del dvieju ar vienos uzklausos..
Tarkim, pirmoje lenteleje yra 1,000,000 irasu, o antroje lenteleje ju yra 100,000. Abiejuose lentelese ID laukai yra indeksai INT auto increment. Taigi, minde, kaip pats darytum? Naudotum viena uzklausa be LIMIT ar dvi uzklausas su LIMIT? Mano tikslas - sunaudoti kuo maziau serverio resursu. Dekui.

Re: Viena uzklausa be LIMIT ar dvi uzklausos su LIMIT?

Ajaks wrote:
zygis wrote:

Totali netiesa, normalūs query builderiai nuskaito lentelės stulpelius su tipais ir tinkamai viską sudėlioja. Duomenys apie stulpelius ir tipus - kešuojami.

'Normalus query builderiai'...ople, ura! Tai kam tada isviso vargti, jeigu yra 'normalus query builderiai' kurie viska padaro ir visiems viskas dzin. Neverta net sita tema kalbeti.

Geras klausimas "kam vargti", bet panašu, kad visgi kažkas rašo savo... Tik įdomu kuriam čia viskas dzin. Kad neverta kalbėti toliau - tai tikrai. Kiekvienas liekam prie savo užsikeltos kokybės kartelės.

MongoDB Certified Developer
MongoDB Certified DBA
Zend Certified Engineer

Re: Viena uzklausa be LIMIT ar dvi uzklausos su LIMIT?

Tu pasiziurek, kiek tas 'builderis' uztrunka papildomai tikrindamas tipus ir kiek uztrunka to visiskai nedarydamas bet naudojant kabutes. Ir nereikes svaigti apie tiesas kurias sugalvojai is lempos.

Re: Viena uzklausa be LIMIT ar dvi uzklausos su LIMIT?

Ajaks wrote:

Tu pasiziurek, kiek tas 'builderis' uztrunka papildomai tikrindamas tipus ir kiek uztrunka to visiskai nedarydamas bet naudojant kabutes. Ir nereikes svaigti apie tiesas kurias sugalvojai is lempos.

Taigi dzin, kompas padarys. Pala, ne dzin. O tai kaip dėl tų kabučių?
Galima ir batonu su vandeniu gyvam būti, bet ar patenkintas būsi?
Galima rašyti kodą belekaip ir įdėti komentarą "/* Your time is being wasted right now! */"
Galima daryti ką nori :) Galima džiauti/dėti/pasiūlyti susikišti savo nuomones kitiems ten kur jiems nesueina! Aišku, kad galima. Bet tau žmonės pataria, kurie dirba ne prie vieno projekto, ne vienus metus programuoja ir supranta ką pataria. Aišku, kad tam procesoriui nusišikt ant tokios operacijos (sąlyginai), bet jei rašysi kodą gerai iškart, ateity bus mažiau "oj bleddd wtf p1derai dblai programuotojai, sulaužyt rankas!".

Peace.