Peršokti į turinį
  • ŽAIDIMAI
  • , ŽAIDIMAI
  • ŽAIDIMAI

[Pamoka]MySQL R33 "unthreaded"


bebras

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 3844 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Recommended Posts

Sveiki, ir vėl aš gadinu jums vakarą su tuo savo MySQL....

Bet šiandienos pamoka bus šiek tiek kitokia, nematysite tokių funkcijų kaip "mysql_function_query" ar "mysql_tquery"...

Šiandien pasakosiu apie "unthreaded" užklausas. Tokias kokios naudojamos jūsų numylėtajame - R6 BlueG MySQL plugin versijoje. Bet kas pastūmėjo mane rašyti šią pamoką, tai jog naudosime BlueG MySQL R33 plugin versiją! Kaip žinome jis pristatė naujas, ORM, funkcijas, bet dar nebėkit, daugiau apie jas neužsiminsiu, pažadu.

Pirmiausia noriu pristatyti greičio testo rezultatus, kurie mane tikrai nustebino, testas atliktas kraunant 500 eilučių:

[19:32:33] Visas krovimas su MySQL R5 užtruko:1137 MS // Įjungus mysql log
[17:48:54] Visas krovimas su MySQL R5 užtruko:344 MS  //Įšjungus mysql log.
[19:33:08] Visas krovimas su MySQL R33 užtruko:10 MS

Viskas taip gerai kad net nesinori tikėti. Taip ir padarysime ignoruokime skaičius ir lekiame toliau.

Pagaliau po vienos ilgiausių mano įžangų, eisime prie darbo. Kad būtų lengviau suprasti "kam?kodėl?kaip?", imituosime verslų sistemą. Pradėkime nuo dalykų kurie nesusiję su tema ir įsivaizduosiu kad jūs juos mokate:

#define MAX_VERSLAI 500
enum verslu_info {
ID,
Pavadinimas[101],
Savininkas[MAX_PLAYER_NAME],
Float:EnX,
Float:EnY,
Float:EnZ,
Interjeras,
PelnasH,
Pelnas
};
new Verslai[MAX_VERSLAI][verslu_info];

Nieko stebuklingo. Bet susikursime vieną globalų kintamąjį kuris yra svarbus:

new Db; // Tai tėra kintamasis kuriame bus saugojamas prisijungimo prie duombazės numeris

Jungiamės prie MySQL ir įjungiame serverio mysql log'ą:

mysql_log(); // Tai yra lygu "mysql_debug(1);" R6 versijoje
Db = mysql_connect("localhost","root","testas",""); // Štai ir įrašome prisijungimo numerį į kintamajį

Pagaliau paruošėme viską darbui! Pripažinkit, sunku nebuvo.

Krauname verslų informaciją:

new Cache:data = mysql_query(Db,"SELECT * FROM verslai");
for(new i; i < cache_get_row_count(); i++)
{
if(i == MAX_VERSLAI) break;
Verslai[i][iD] = cache_get_field_content_int(i, "ID");
cache_get_field_content(i,"Pavadinimas",Verslai[i][Pavadinimas],Db,101);
cache_get_field_content(i,"Savininkas",Verslai[i][savininkas],Db,MAX_PLAYER_NAME);
Verslai[i][EnX] = cache_get_field_content_float(i,"EnX");
Verslai[i][EnY] = cache_get_field_content_float(i,"EnY");
Verslai[i][EnZ] = cache_get_field_content_float(i,"EnZ");
Verslai[i][interjeras] = cache_get_field_content_int(i,"Interjeras");
Verslai[i][PelnasH] = cache_get_field_content_int(i,"PelnasH");
Verslai[i][Pelnas] = cache_get_field_content_int(i,"Pelnas");
}
cache_delete(data);

O dabar, pakalbam!

"mysql_query(...)" - Funkcija (tikiuosi) jums žinoma, ji išsiunčia užklausą į duomenų bazę. Pirmasis jos parametras yra kintamasis "db" kurį gavome prisijungdami prie duomenų bazės. To reikia kad funkcija žinotų kur siųsti tą užklausą. Kodėl ankščiau nereikėjo? Skaityk *

"new Cache:data", dėl šito jums rūpintis nereikia, tik pasakysiu jog tai skirta kad galėtume ištrinti tai ką išgavome iš duomenų bazės

"cache_get_row_count()" - funkcija gražina gautų eilučių skaičių(visai kaip mysql_num_rows() )

"cache_get_field_content_int" - ši funkcija išgauna visą "gyvybę" iš duombazės. Sakydamas "gyvybę" kalbu apie duomenis. Pirmas jos parametras yra eilutės numeris iš kurios įrašinėsime duomenis. Antrasis parametras yra stulpelio pavadinimas duomenų bazėje

"cache_get_field_content" - taspats kaip ir atvejis viršuje, išskyrus ši funkcija krauna string tipo duomenis. Trečiasis parametras, nurodome į kur išsaugoti duomenis, po to seka mūsų duomenų bazės kintamasis. Ir svarbiausia, paskutinis parametras: tai yra kintamojo į kurį įrašinėjame dydis.Kodėl taip reikia? Skaityk **.

"cache_get_field_content_float" - tapati istorija kaip su "cache_get_field_content_int" tik krauname Float tipo duomenis.

"cache_delete(data)", prisimenat "data", tai kintamasis kurį gražino "mysql_query". O funkcija tiesiog ištrina duomenis kad nelaikyti jų atmintyje, kaip "mysql_free_result".

Ir visas krovimas!

Saugojimo užklausose niekas nesikeičia, išskyrus pirmąjį "mysql_query" parametrą.

*Ankščiau duomenų bazės numerio nereikėdavo nurodyti nes, jis būdavo visada vienodas. Dabar galima jungtis prie kelių duomenų bazių(dar viena smagi funkcija)! Todėl reikia būdo jas atskirti.

**Kad tai išaiškinčiau, pažiūrėkime į funkciją, kaip ji atrodo įskiepyje

[size=6][size=4]native cache_get_field_content(row, const field_name[], destination[], connectionHandle = 1, max_len=sizeof(destination));

Kas mus domina, tai paskutinis jos parametras "max_len=sizeof(destination)" tai reiškia jog jei nebus nurodytas dydis, bus paimtas "destination" dydis. Kas atrodo gerai, bet taip nėra! Kaip manote koks yra "sizeof(Verslai)" ? Tai yra masyvas, jo dydis 500. Ir toks skaičius mums netinka nes tai neties! Trumpai: kraunant į masyvą, dydis neatitiks to laukelio į kurį krauname.[/size][/size]

Viskas! Tiesą sakant, nebežinau ką dar apie MySQL galėčiau jums papasakoti...

Ką daryti nesikartosiu, jau tikiuosi žinote! Gero vakaro!

Redaguota , nario Bebras
  • Teigiamai 4
Nuoroda į komentarą
Dalintis per kitą puslapį

Atnaujinau greičio rezultatus. Išsiaiškinau kodėl testas rodė jog R33 versija kraunant 500 eilučių buvo greitesnė ~100 kartų.

Atsakymas paprastas, dėl MySQL log. Kiekvieno verslo krovimui į mysql_log būdavo įrašomi tokie duomenys:

[19:32:12] >> mysql_fetch_field_row( Connection handle: 1 )
[19:32:12] CMySQLHandler::FetchField("ID") - 1
[19:32:12] >> mysql_fetch_field_row( Connection handle: 1 )
[19:32:12] CMySQLHandler::FetchField("Pavadinimas") - Bebro verslas
[19:32:12] >> mysql_fetch_field_row( Connection handle: 1 )
[19:32:12] CMySQLHandler::FetchField("Savininkas") - Bebras
[19:32:12] >> mysql_fetch_field_row( Connection handle: 1 )
[19:32:12] CMySQLHandler::FetchField("EnX") - 541.505
[19:32:12] >> mysql_fetch_field_row( Connection handle: 1 )
[19:32:12] CMySQLHandler::FetchField("EnY") - 34
[19:32:12] >> mysql_fetch_field_row( Connection handle: 1 )
[19:32:12] CMySQLHandler::FetchField("EnZ") - 35
[19:32:12] >> mysql_fetch_field_row( Connection handle: 1 )
[19:32:12] CMySQLHandler::FetchField("Interjeras") - 5
[19:32:12] >> mysql_fetch_field_row( Connection handle: 1 )
[19:32:12] CMySQLHandler::FetchField("PelnasH") - 0
[19:32:12] >> mysql_fetch_field_row( Connection handle: 1 )
[19:32:12] CMySQLHandler::FetchField("Pelnas") - 0
[19:32:12] >> mysql_retrieve_row( Connection handle: 1 )
[19:32:12] >> mysql_num_rows( Connection handle: 1 )

Pagalvokit kiek užtrunka tai padaryti 500 kartų.

Naujieji testai, daug įtikinamesni :)

  • Teigiamai 1
Nuoroda į komentarą
Dalintis per kitą puslapį

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 3844 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Svečias
Ši tema yra užrakinta.
  • Šiame puslapyje naršo:   0 nariai

    • Nėra registruotų narių peržiūrinčių šį forumą.

Skelbimai


×
×
  • Sukurti naują...