Kaip galima būtų efektyviai atnaujinti/įrašyti didelius kiekius įrašų? Nes kiekvienam įrašui kviesti atskirą UPDATE/INSERT funkciją neatrodo gerai...
Bebras prieš 9 metus
Ką reiškia "kiekvienam įrašui"?
Ir taip pat paminėk kas yra tavo nuomone "didelis kiekis", nes turiu nuojauta kad jis nebus toks didelis. Nepamiršk kad MySQL yra pratusi dirbti su DIDELIAIS(milijonai eilučių) kiekiais.
aurimasko prieš 9 metus
Na tarkim turiu masyvą, kuriame surašyta 1-2k eilučių. Man reikia jį išsaugoti į duomenų bazę kas kokių 15-30 min. Tai su for ciklu saugai kiekvieną įrašą atskirai (nes pvz viename įraše pasikeitė reikšmė, kitas ištrintas, trečias prisidėjo), bet tada gaunasi labai daug sql užklausų. :?
Ir taip, 1-2k mysqlui nėra didelis kiekis, bet ar nuo to nepradės lagint serveris?
Bebras prieš 9 metus
Na nuo tiek vienu metu tikrai pasijaus, nes kitaip ir neišeis: tik po vieną užklausą(BlueG kažkodėl nusprendė kad reikia uždraust vienu mysql_query kelias užklausas siųst).
O kas tai per duomenys? Negali po kelis, iš karto jiems pasikeitus, atnaujint DB?
aurimasko prieš 9 metus
Kažkaip galvojau, kad galbūt geriau atnaujint bendrai, bet ištikro visgi kas kart atsinaujinus geresnis variantas.. Turbūt naktis ir mažai miego daro savo :D O ten tiesiog world'e esančių daiktų informacija, tiesiog ji labai dažnai ir bet kada gali pasikeisti, todėl ir šovė tokia mintis..
TETYYS prieš 9 metus
jei taip darai, reiskias yra kazkas blogai pas tau sampe pagal dizaina, duomenis turetum atnaujint tada kai jie pasikeicia, o ne per scheduleri
aurimasko prieš 9 metus
Pasidariau ten kitaip, kad iškart atnaujintų. Dabar biški kitas dalykas, bet nenoriu kurt naujos temos.
Turiu tokią lentelę:
CREATE TABLE IF NOT EXISTS `items` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`player_id` int(9) NOT NULL,
`item_id` int(9) NOT NULL,
`item_amount` int(11) NOT NULL,
PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_lithuanian_ci AUTO_INCREMENT=0 ;
Ir kažkokią tokią užklausą:+1: INSERT INTO `%s` (`player_id`, `item_id`, `item_amount`) VALUES ('%d', '%d', '%d') ON DUPLICATE KEY UPDATE `item_amount`='%d';
Kaip padaryt, kad jei lentelėje yra įrašas, kurio player_id
ir item_id
yra vienodi, tai įrašo neįrašynėtų, o tiesiog atnaujintų esamą?
Bebras prieš 9 metus
Jei nori naudotis ON DUPLICATE KEY tada tavo lentelė turėtų būti tokia:
CREATE TABLE IF NOT EXISTS `items` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`player_id` int(9) NOT NULL,
`item_id` int(9) NOT NULL,
`item_amount` int(11) NOT NULL,
PRIMARY KEY (player_id, item_id),
INDEX(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_lithuanian_ci AUTO_INCREMENT=0 ;
Ir tada:
INSERT INTO items (player_id, item_id, item_amount) VALUES(%d, %d %d) ON DUPLICATE KEY UPDATE item_amount = VALUES(item_amount);
TETYYS prieš 9 metus
o kur indeksavimas?
CREATE TABLE IF NOT EXISTS `items` ( `id` int(11) NOT NULL AUTO_INCREMENT, `player_id` int(9) NOT NULL, `item_id` int(9) NOT NULL, `item_amount` int(11) NOT NULL, PRIMARY KEY (`id`), ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_lithuanian_ci AUTO_INCREMENT=0 ;