Sveiki, pirma karta prireike tokio dalyko. Sakykime, turiu sitokia uzklausa:

SELECT * FROM lentele ORDER BY date

date laukelis - data.

Kaip pakeisti ORDER, kad ateinancias datas paliktu priekyje, bet jau praejusias - nukeltu i gala? T.y. reikia, jog is sios uzklausos visas dar neatejusias datas sukeltu i prieki.

Isprendziau pats:

ORDER BY (NOW() > date)

Taip.

Dabar as uzsetinu kintamaji, pvz 'lastHeader', ir su mysql_fetch_array pro visus eidamas, ziuriu ar lastHeader sutampa su esamo iraso, jei nesutampa, isvedu pagrindines kategorijos pavadinima ir pakeiciu kintamaji.

SELECT a.id, a.tekstas, b.id, b.pavadinimas
FROM `kat` AS a
   RIGHT JOIN `sub` AS b on a.id=b.kat_id
ORDER BY a.id, b.id

kat:
-----------
id, tekstas

sub:
-----------
id, kat_id, pavadinimas

Cia generuojamas meniu - kategorijos ir subkategorijos, taciau as kitaip nesugalvoju kaip pakeisti sita uzklausa, kad nereiktu su paciu kodu tikrinti, ar jau pasikeite pagrindine kategorija.

Manau, kad yra zymiai paprastesnis sprendimas, o ir daznai panasiu dalyku reikia...

Bus keliasdešimt lentelių: vartotojų (id, vardas, pass, kordinatės (atnaujinama tik pakeitus pass/atsijungus/per autosave kas 20-30 sec (arba ilgiau, kad ir 1 minutė...))), jų išvaizdos, banko lentelė, daiktų ir t.t.

Dabar serveris prisijugimo metu visus duomenis nuskaito į masyvus arba hashtables (arraylistus, listus, maps ir t.t.; priklausomai nuo duomenų).

Veiksmai vyksta su duomenimis, esančiais atmintyje, o mysql atnaujinamas atsijungus arba per autosave event, kai išsaugomi visi vartotojo duomenys (apsauga nuo duomenų praradimo serverio sustojimo veikti atveju).

Aciū, pabandysiu, jei kils klausimų - rašysiu :)

(vistiek serveris stovės atskiras, tai galiu įsijungti InnoDB :) )


Lukas wrote:
Plx wrote:

Be to, jei žaidžia 500 žaidėjų, kiekvienas jų turi po 200 daiktų, tai gaunas 100K užklausų kas keliolika sekundžių. Daugokai?

O kodėl negalima tiesiog SELECT * FROM daiktai WHERE user_id = $USER_ID  ir belieka 1 užklausa 1 žaidėjui. Jei nereikia visų daiktų, tiesiog į WHERE įrašai reikiams salygas, arba tiesiog riboji kiekį iki pvz 30 su LIMIT 30 etc

Gerai, paimti paimsiu, bet kaip man tuos daiktus išsaugoti? 1 įrašas - 1 užklausa.

Sveiki, vystau tokį žaidimo serverį, kuris šiuo metu naudoja XML kaip duombazę, todėl ganėtinai nepatogus duomenų rikiavimas ir pan., todėl norėčiau perdaryti sistemą ant MySQL. Serveris parašytas ant Java.

Sakykime, kad visi žaidėjo daiktai iššsaugomi lentelėje, kiekvienam daiktui 1 įrašas (visko į 1 kišti nenoriu, nes nebetenka savo prasmės).

Keletas klausimų:

Kaip apsisaugoti nuo duomenų praradimo? įsivaizduoju, jog turėtų būti daroma taip: ištrinami seni duomenys, įrašomi nauji. Tačiau kas bus jei po ištrynimo dėl kokių tai priežasčių nebegalės įrašyti naujų duomenų? Galbūt įmanoma tai padaryti kaip nors kitaip?

Be to, jei žaidžia 500 žaidėjų, kiekvienas jų turi po 200 daiktų, tai gaunas 100K užklausų kas keliolika sekundžių. Daugokai?

SpX wrote:

kiek ten milijonu lankytoju ? :) beje, jei nezinai ar galima optimaliau, tai kodel manai kad cia gali buti "neoptimalu" :)

Kiek lankytoju nesvarbu, pikti dedes gali suzinoje apie sia 'silpna' vieta gerokai pakankinti serveri, ir isnaudoti valandinius limitus :)

Taip nutiko, kad reikia padaryt el. parduotuve :)

Susiduriau su problema, mat mano nedidelios mysql zinos nezino, ar imanoma kaip nors optimizuot sia veiksmu eile:

$buvo = mysql_query("SELECT prekes_id, kiekis FROM krepselis WHERE id='{$info[$i]}'");
$id = mysql_result($buvo, 0, 0);
$kiekis = mysql_result($buvo, 0, 1);
$ok = mysql_query("UPDATE prekes SET kiekis=kiekis+{$kiekis} WHERE id='{$id}'");
if ($ok)
    mysql_query("DELETE FROM krepselis WHERE id='{$info[$i]}'");

Atrodo, kad 3 uzklausos nedaug, taciau gali buti taip, kad sis kodas bus prasuktas ~10-50 kartu vienu metu, o tai jau yra tikrai neoptimalu.