Autor Zpráva
ProbablyYes
Profil
Zdravím,

potřeboval bych z PHP cronu do databáze odeslat přibližně 500 update dotazů na mysql databázi za přibližně 50 sekund.
Všechny směřují na jednu tabulku, ale na sloupce, které nemám možnost dopředu zjistit.

Našel jsem například možnost INSERTu s ON DUPLICATE KEY UPDATE, ovšem různé dotazy updatují v různých řádcích různé sloupce a tak jsem narazil. Zkoušel jsem také mysqli_multi_query, ale výsledkem bylo odeslání pouze malého množství dotazů.

Je zde možnost jak požadavek poslat rozumně najednou, aby to databáze v rozumné rychlosti přechroustala?
Jsem si vědom toho, že se nejedná o nejrozumnější návrh, ale problém s výkonem je až nyní a potřebuji hot-fix, než aplikaci celou přepíšu.



Děkuju za všechny reakce!
Kajman
Profil
Pokud nepotřebujete aktualizovat sloupec na hodnotu null, tak cesta s on duplicate key by v kombinaci s coalesce neměla být problém i pro aktualizaci různých sloupců - tedy vložíte null, pokud se nemá ten sloupec měnit a v update použijete něco jako

sloupec=coalesce(values(sloupec),sloupec)
ProbablyYes
Profil
Kajman:
Díky za reakci. Bohužel mám však s implementací problém. V případě že do values(sloupec) pošlu NULL, data v buňce skutečně zmizí, místo aby zůstala data původní.
INSERT INTO test (id,text,time) 
VALUES 
(1,'edit7',555),
(2,'edit7',NULL), 
(3,'edit7',NULL) 
ON DUPLICATE KEY UPDATE time = COALESCE(VALUES(time),time)
Zkoušel jsem to také přepsat na podobu níže, bohužel bezvýsledně.
ON DUPLICATE KEY UPDATE `time` = IF(VALUES(`time`) IS NOT NULL, VALUES(`time`), `time`)

Pokud se nesnažím upravit 3 řádky najedou, ale pouze jeden, MySQL mi vynadá, že dané buňky nemohou být nastaveny na NULL. Což ovšem nedává smysl - na NULL se je nastavit nesnažím.
Kajman
Profil
Tady nemizí...
sqlfiddle.com/#!9/92395/1

Ale problém může být s not null konfigurací sloupců. Můžete si udělat pomocnou (třeba temporary) tabulku s obdobnými sloupci ale s možností null hodnot. Tu si jedním insertem naplnit 500 řádky a pak udělat jeden update s joinem.

Případně udělat tolik updatů, kolik je měněných sloupců (jeden řádek může být upraven více updaty), kdy se bude měnit pouze jeden sloupec a pouze u řádků, kde se měnit má.
ProbablyYes
Profil
Kajman:
Ale problém může být s not null konfigurací sloupců.
Přesně tak. Byl. Sice to pro mě moc nedává smysl, proč by to mělo MySQL vadit, ale vadí. Jakmile jsem u příslušných sloupců NULL hodnoty povolil, dotaz se bez problémů provedl.

Tímto tedy děkuju, Kajman, za pomoc. Pěkné, elegantní řešení a jako bonus se provede skutečně rychle. Ještě jednou díky!

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: