Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
sõnum |
|
SGM
HV kasutaja
liitunud: 04.12.2005
|
07.03.2008 12:46:17
massteate saatmine kasutajatele saidil? |
|
|
Tekkis selline küsimus, et kui ma saadan mingi administraatori teate kõigile veebilehe liikmetele, siis peaks ju tegema sadu (või tuhandeid) päringuid järjest üksteise otsa?
Mul hetkel on süsteem selline, et MySQL-andmebaasis on tabel nimega näiteks "teated", kuhu sisestatakse info ja tekst. Iga kasutaja jaoks, kellele teade läheb, sisestatakse ka selle kasutaja ID, et just tema selle teate saaks. Aga kui saadan sellise teate, mis läheb kõigile, siis pidin panema teate saatmise (insert into teated...) while(){} vahele, aga see vist on serverile paras koormuse hetk? Kui sedasi teen, siis äkki hakatakse õiendama ja jään kontost ilma? Äkki on mingi muu võimalus? Kuna ma ei tea seda, esimest korda hakkasin teadete peale mõtlema, siis ei tea ka seda, kas äkki nii tehaksegi ja ma ilmaasjata põen?
|
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
|
:: |
1 :: |
1 :: |
0 |
|
tagasi üles |
|
|
mikk36
HV Guru
liitunud: 21.02.2004
|
07.03.2008 12:55:10
|
|
|
hull koormusehetk on siis, kui see päring on keerukas ja võtab aega
testi järgi ja vaata palju aega võtab (mõõda php's)
kui hakkavad juba selle peale kobisema, siis ütle et sa tegeled optimiseerimisega
ja kui hakkavad ka siis plõksima, siis on aeg teenusepakkujat vahetada
|
|
Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
2 :: |
78 |
|
tagasi üles |
|
|
nn3_
HV kasutaja
liitunud: 13.09.2003
|
07.03.2008 13:14:18
|
|
|
Ei pea iga kasutaja jaoks eraldi INSERT lauset tegema tsükliga, vaid uuri INSERT ... VALUES () või kui sisestamine sõltub näiteks teisest tabelist siis INSERT ... SELECT lauseid, nendega saad palju ridu ühe päringuga sisestada ja see on juba väga kiire (sadu tuhandeid ridu hetkega).
tsitaat: |
INSERT statements that use VALUES syntax can insert multiple rows. To do this, include multiple lists of column values, each enclosed within parentheses and separated by commas. Example:
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
|
http://dev.mysql.com/doc/refman/5.0/en/insert.html
http://dev.mysql.com/doc/refman/5.0/en/insert-select.html
|
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
|
:: |
1 :: |
0 :: |
3 |
|
tagasi üles |
|
|
SGM
HV kasutaja
liitunud: 04.12.2005
|
07.03.2008 18:08:41
|
|
|
Hetkel on mul nii:
$sql = "SELECT ID FROM kasutajad";
$alusta = microtime();
$res = mysql_query($sql);
while($row = mysql_fetch_row($res)){
$id = $row[0];
$res2=mysql_query("INSERT INTO teated (`1`, `2`) VALUES ('$1', '$2')");
echo mysql_error();
}//while
$lopeta = microtime();
$aega = round($lopeta - $alusta, 4); |
ja see annab pärast pikka ootamist teate:
Fatal error: Maximum execution time of 60 seconds exceeded ...
Vaatasin myadminist, et oli sisestanud küll palju ridu, aga siis mitte piisavalt kähku.
Siis vaatasin seda nn3_ toodud õpetust, aga hetkel jälle on see liiga hiinakeelne. Kuidas ma saan nii teha, et teade saadetakse kõigile kasutajatele, lisaks mingi where sinna juurde, et nt kõigile saadaks, kes on aktiveeritud?
Esialgu siis proovisin natuke lihtsamalt seda, vaatasin seal dev.mysql-i lehelt, tegin nii:
INSERT INTO teated (`date` , `from` , `to_id` , `from_id` , `text`) VALUES ('$date', '$kasutaja', '$to_id', '$from_id', '$teade') SELECT kasutajad.id FROM kasutajad |
Aga tulemuseks oli täpselt sama , fatal error.
Kuigi lisas küll mingi arvu, paarsada vist...
Ma oma localhostis katsetan, mul on siin XAMPP, installitud novembris uus versioon; CPU on core2duo E4500, seega nõrk ei ole. Indikaator ka eriti ei kõssa selle ajal, kui see script seal vaikselt kuni fatal errorisse jookseb.
|
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
|
:: |
1 :: |
1 :: |
0 |
|
tagasi üles |
|
|
mikk36
HV Guru
liitunud: 21.02.2004
|
07.03.2008 18:21:22
|
|
|
pane iga while peale count'i echoma, saad teada täpse aja millal kinni läheb
teine küsimus: miks see sisestus sul nii aeglane on ? (vaid paarsada sisestust minutis)
update käsuga lendas mul paari tuhandikuga paarsada rida ümber (eraldi querydena ja enne iga query esitamist veel if'iga väärtuse kontroll ja uue väärtuse määramine vastavalt olemasolevale väärtusele, üks tabel eelnevalt siis array'sse sikutatuna et mida panna uueks väärtuseks)
|
|
Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
2 :: |
78 |
|
tagasi üles |
|
|
Brom
HV kasutaja
liitunud: 18.07.2005
|
07.03.2008 18:44:32
|
|
|
Sa võid kasutajad ära grupeerida.
Kuvades pealehte teeb skript kasutajanimega päringu ja, kui ta on grupis, kelle teade on määratud, siis see kuvatakse.
|
|
Kommentaarid: 13 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
13 |
|
tagasi üles |
|
|
julmu
HV kasutaja
liitunud: 20.12.2004
|
07.03.2008 18:55:44
|
|
|
link :: INSERT ... SELECT Syntax
sql:
|
INSERT INTO teated (`date` , `from` , `to_id` , `from_id` , `text`) SELECT '$date', '$kasutaja', id, '$from_id', '$teade' FROM kasutajad WHERE aktiivne
|
|
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
|
SGM
HV kasutaja
liitunud: 04.12.2005
|
07.03.2008 19:32:20
|
|
|
julmu kirjutas: |
sql:
|
INSERT INTO teated (`date` , `from` , `to_id` , `from_id` , `text`) SELECT '$date', '$kasutaja', id, '$from_id', '$teade' FROM kasutajad WHERE aktiivne
|
|
Täpselt sama ootamine ja sama error.
Kasutajaid grupeerida ei ole vaja, kuna teade läheb kõigile.
Ja seekord ei pidanud enam while() ju kasutama, kui see sama päring ise peaks kõik ära tegema.
Äkki teen ikka miskit valesti? Või on mul XAMPP kuidagi katkine? Päris serveris ei julge veel proovida.
|
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
|
:: |
1 :: |
1 :: |
0 |
|
tagasi üles |
|
|
mikk36
HV Guru
liitunud: 21.02.2004
|
07.03.2008 19:43:47
|
|
|
SGM, echo see query välja ja ära andmebaasile esita php kaudu
proovi seejärel ise käsitsi näiteks phpmyadmini, navicati või muu adminliidese kaudu see päring esitada ja vaata mis juhtub
|
|
Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
2 :: |
78 |
|
tagasi üles |
|
|
andrusny
Kreisi kasutaja
liitunud: 20.03.2006
|
07.03.2008 20:17:11
|
|
|
Võib täiesti mööda olla, kuid saan aru, et sul on vaja uuendada ainult üht välja kasutaja taga, kas siis mitte ei peaks kirjutama sedasi.
$paring="UPDATE teated SET text = '".$sisu."' "; |
_________________
|
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
|
SGM
HV kasutaja
liitunud: 04.12.2005
|
07.03.2008 21:51:19
|
|
|
andrusny kirjutas: |
Võib täiesti mööda olla, kuid saan aru, et sul on vaja uuendada ainult üht välja kasutaja taga, kas siis mitte ei peaks kirjutama sedasi.
$paring="UPDATE teated SET text = '".$sisu."' "; |
|
Ei, seal on mul eraldi tabel kasutajad ja eraldi tabel teated.
Kasutajad on vaja saada kasutajate tabelist, nende ID-d sealt siis, mis olemas on kõik. Nendele siis iga ID kohta läheb teadete tabelisse uus rida, koos teatega ja ajaga.
Aga mismoodi ma seda query-t echon? See annab vaid mingi paar sõna vms.
|
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
|
:: |
1 :: |
1 :: |
0 |
|
tagasi üles |
|
|
AMD
HV veteran
liitunud: 29.07.2003
|
07.03.2008 22:44:42
|
|
|
$query = 'select ... ';
echo $query;
Sedasi äkki?
_________________ From now on, the forum is owned by AMD.That means that you are NO LONGER allowed to talk about, or even mention *ntel. |
|
Kommentaarid: 335 loe/lisa |
Kasutajad arvavad: |
|
:: |
145 :: |
3 :: |
12 |
|
tagasi üles |
|
|
andrusny
Kreisi kasutaja
liitunud: 20.03.2006
|
07.03.2008 23:43:51
|
|
|
Hakkasin asja huvi pärast proovima. Kas sa selle tabeli oled üldse saanud teha? Minul keeldub PhpMyAdmin tekitamast lahtrit from. Asendasin selle kellelt ja lahtri text asendasin teade siis alles oli nõus tabeli tegema. Sellest võib tuleneda ka sinu päringute venimine ja mittetoimimine.
paring="INSERT INTO teated ( id , date , kellelt , to_id , from_id , teade ) VALUES ( NULL , NULL ,'".$kellelt."' , '".$to_id."' , '".$from_id."' , '".$teade."')" ; |
Edit: Proovisin siis andmeid sisestada. Tegin lihtsa for tsükli ja laksin sama sisuga 30000 ridakirjutada sinna tabelisse. Aega võtsin visuaalselt - lugesin sekundeid. Päring kestis umbes 4 sek
Lahtri date tüübiks panin timestamp ja seljuhul Kirjutatakse selle sisestamise kohale NULL
_________________
|
|
Kommentaarid: 7 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
7 |
|
tagasi üles |
|
|
linnumees
HV kasutaja
liitunud: 15.06.2005
|
|
Kommentaarid: 3 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
3 |
|
tagasi üles |
|
|
nn3_
HV kasutaja
liitunud: 13.09.2003
|
08.03.2008 13:14:18
|
|
|
SGM kirjutas: |
Täpselt sama ootamine ja sama error. :( |
Anna see kood mis Sul praegu veani jõuab (nii php kui SQL pool).
|
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
|
:: |
1 :: |
0 :: |
3 |
|
tagasi üles |
|
|
raxz
HV Guru
liitunud: 27.07.2003
|
09.03.2008 20:06:34
|
|
|
No kui sa tahad kõikidele kasutajatele teadet jätta, siis kirjuta HTMLi see sisse.
IMO lihtsaim variant. Võid ka kontrollida, et kui kasutaja sisse logitud, siis näeb seda teadet.
|
|
Kommentaarid: 46 loe/lisa |
Kasutajad arvavad: |
|
:: |
1 :: |
0 :: |
45 |
|
tagasi üles |
|
|
tomps01
HV vaatleja
liitunud: 09.06.2004
|
10.03.2008 11:40:26
|
|
|
Nagu Kevades öeldi - kui sa kõike ei jõua, siis tee pool. Äkki oleks kasulik miski limit parameeter päringu sisse panna ja sisestada jupikaupa oma asjad. Siis saad vajadusel ka erinevate vahemike käimalaskmise aegu venitada (a'la pool tundi jätad vahet) ning serverite koormust jagada.
|
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
|
SGM
HV kasutaja
liitunud: 04.12.2005
|
23.03.2008 13:18:13
|
|
|
nn3_ kirjutas: |
SGM kirjutas: |
Täpselt sama ootamine ja sama error. |
Anna see kood mis Sul praegu veani jõuab (nii php kui SQL pool). |
Viimati katsetasin midagi sellist:
INSERT INTO teated (`date` , `toid` , `fromid` , `text`)
SELECT '$date', id, '$id', '$teade' FROM kasutajad WHERE active = '1' AND block = '0' |
Aga ka see ajas minuti jooksul paarsada sisestus db-sse ja siis tuli fatal error. :/
|
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
|
:: |
1 :: |
1 :: |
0 |
|
tagasi üles |
|
|
mikk36
HV Guru
liitunud: 21.02.2004
|
23.03.2008 17:37:26
|
|
|
SGM, sa annad ju ainult php poole
anna kood, mida reaalselt mysql kätte saab
ehk siis näiteks:
echo "INSERT INTO teated (`date` , `toid` , `fromid` , `text`)
SELECT '$date', id, '$id', '$teade' FROM kasutajad WHERE active = '1' AND block = '0'";
pane selle päringu esitamise asemel
|
|
Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
2 :: |
78 |
|
tagasi üles |
|
|
SGM
HV kasutaja
liitunud: 04.12.2005
|
26.03.2008 16:25:19
|
|
|
mikk36 kirjutas: |
anna kood, mida reaalselt mysql kätte saab
ehk siis näiteks:
echo "INSERT INTO teated (`date` , `toid` , `fromid` , `text`)
SELECT '$date', id, '$id', '$teade' FROM kasutajad WHERE active = '1' AND block = '0'";
pane selle päringu esitamise asemel |
Sel juhul, kui query asemele panin echo, sain nii:
INSERT INTO teated (`date` , `toid` , `fromid` , `text`) SELECT '26.03.2008 - 10:39', ID, '3', 'Teadeee testin teadet!
' FROM kasutajad WHERE active = '1' AND block = '' |
EDIT:
Ma sain vist asja äkki tööle isegi! Üks sõber vaatas tervet koodi ja midagi pisiasja muutis seal...
|
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
|
:: |
1 :: |
1 :: |
0 |
|
tagasi üles |
|
|
mikk36
HV Guru
liitunud: 21.02.2004
|
26.03.2008 17:03:23
|
|
|
no sa olid juba muutnud vahepeal antud queryt, algselt andsid block = '0', tulemus aga block = ''
|
|
Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
2 :: |
78 |
|
tagasi üles |
|
|
|