SQL query op een table met 6,7 miljoen records in php

Pagina: 1
Acties:
  • 143 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een table met 6,7 miljoen records die ik graag omzet in een andere table,
echter voeg ik twee colommen samen en voeg ik daar een extra string aan toe.

ik gebruik hiervoor het volgende php script alleen dat gaat dus mis:
<?
mysql_connect("localhost", "user", "password");
mysql_select_db("database");
$paginaresult = mysql_query("SELECT * FROM table1");
while ($rij=mysql_fetch_object($paginaresult)) {
$column1 ="$rij->column1";
$column1 .="$rij->column2";
$column1 = substr($column1, 1);
$fullstring ="sting";
$fullstring .="$column1";
mysql_query("INSERT into table2 (ncolumn1,ncolumn2,ncolumn3,ncolumn4,ncolumn5) values ('$fullstring','$rij->column3','$rij->column4','$rij->column5','$rij->column6','$rij->column7')");
}
?>

na een tijdje stopt hij gewoon...
Zet ik een limit in de select query dan gaat het goed. Dus ik denk dat de select te lang duurt iemand een idee hoe ik dit kan opvangen ?

M.v.g. Nico Houben

Acties:
  • 0 Henk 'm!

  • Rotjeknor
  • Registratie: April 2001
  • Laatst online: 01-04-2023
Hmmz ff [ php ] gebruiken aub...

Enne over je vraag: misschien een idee je queries af te splitsen dat ie het per 1000 doet oid?

Ook Knor is aangestoken met het ligfietsvirus!


Acties:
  • 0 Henk 'm!

Verwijderd

probeer eens 2 variabelen $limit_from en $limit_to te maken en deze in de query te verwerken onder limit:
code:
1
$paginaresult = mysql_query("SELECT * FROM table1 LIMIT $limit_from, $limit_to");

En daarna de code te onderverdelen dmv de limits telkens een half (of kwart) miljoen te laten verspringen. Dit voorkomt timeouts en hoge serverloads van de server..

Acties:
  • 0 Henk 'm!

Verwijderd

Rotjeknor schreef op 02 December 2002 @ 23:49:
Hmmz ff [ php ] gebruiken aub...

Enne over je vraag: misschien een idee je queries af te splitsen dat ie het per 1000 doet oid?
Op zich moet een beetje mysql-server makkelijk met duizende records in 1 keer om weten te gaan..

Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 06-09 02:30

dusty

Celebrate Life!

code:
1
create table blaat as select id, naam, description from pieperloi, blaataap where pieperloi.id=blaataap.id;
Oracle is wonderbaarlijk.

[ Voor 7% gewijzigd door dusty op 02-12-2002 23:54 . Reden: code tags ]

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op 02 December 2002 @ 23:53:
[...]

Op zich moet een beetje mysql-server makkelijk met duizende records in 1 keer om weten te gaan..
Denk je wel dat het gaat lukken met 250.000 ?

want 6,7 miljoen is wat ik tot nu toe heb ontdekt erg veel !

Acties:
  • 0 Henk 'm!

Verwijderd

En Mysql-Front? Dat is win32 applicatie... die kan gewoon query's uitvoeren zonder dat je met PHP moet klooien... maar dat kan alleen als je substr enzo ook in mysql kan gebruiken.....

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

dusty schreef op 02 December 2002 @ 23:54:
code:
1
create table blaat as select id, naam, description from pieperloi, blaataap where pieperloi.id=blaataap.id;
Oracle is wonderbaarlijk.

Kan mysql ook hoor :)

Acties:
  • 0 Henk 'm!

  • TimMer
  • Registratie: Februari 2000
  • Niet online
Rotjeknor schreef op 02 December 2002 @ 23:49:
Hmmz ff [ php ] gebruiken aub...

Enne over je vraag: misschien een idee je queries af te splitsen dat ie het per 1000 doet oid?
Bij deze :) :
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?
mysql_connect("localhost", "user", "password");
mysql_select_db("database");
$paginaresult = mysql_query("SELECT * FROM table1"); 
while ($rij=mysql_fetch_object($paginaresult)) { 
$column1 ="$rij->column1";
$column1 .="$rij->column2";
$column1 = substr($column1, 1);
$fullstring ="sting";
$fullstring .="$column1"; 
mysql_query("INSERT into table2 (ncolumn1,ncolumn2,ncolumn3,ncolumn4,ncolumn5)
values ('$fullstring','$rij->column3','$rij->column4','$rij->column5','$rij->column6','$rij->column7')");
} 
?>

[ Voor 16% gewijzigd door TimMer op 03-12-2002 01:33 ]


Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 06-09 02:30

dusty

Celebrate Life!

ACM schreef op 03 December 2002 @ 01:20:
[nohtml]
[...]
[/nohtml]
Kan mysql ook hoor :)

Ga nou eens niet alles verklappen joh.. altijd alles verpesten.. zo is het toch ook niet meer leuk voor mij.. tssssssss.. :P

Had gehoopt dat een van de andere mensen die het niet wist eens in de manual gingen kijken om te zien of er iets soortgelijks bestond voor mysql.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 06-09 02:30

dusty

Celebrate Life!


Je code is fout. Het kan namelijk verkeerd gaan met jouw code.

[leraar mode]Kan iemand uitleggen waarom?[/leraar mode]
:P

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

Verwijderd

Ikke Ikke Ikke zeggen meeesterr!!!

Bij een single kwoot! een single kwoot! dan krijg je dubbele in de string! vintie niet fijn!

/me wacht met smart op zn koekkie

[ Voor 49% gewijzigd door Verwijderd op 03-12-2002 09:11 ]


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 10-09 08:45

Bosmonster

*zucht*

$paginaresult = mysql_query("SELECT * FROM table1");
Omdat ie nu een voleldige tabel met 6,7 miljoen records in het geheugen heeft? :P

Misschien is een alter table wat minder intensief :?

ipv 6,7 miljoen insert-queries achter elkaar..

[ Voor 26% gewijzigd door Bosmonster op 03-12-2002 09:18 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 03 December 2002 @ 09:09:
Ikke Ikke Ikke zeggen meeesterr!!!

Bij een single kwoot! een single kwoot! dan krijg je dubbele in de string! vintie niet fijn!
en ik denk dat het ook wel fout zal gaan als er aan het einde, dus vlak voor het enkele aanhalingsteken een backslash (\) staat... toch..??

Edit:
Yep :P

mysql> insert into testtable (ID, name) values (9, 'naampje\');
'> ;
'> ;
'> \q
'> shit....
'> :)

[ Voor 16% gewijzigd door Verwijderd op 03-12-2002 09:46 . Reden: Ff gecheckt of \' inderdaad fout zou gaan ]


Acties:
  • 0 Henk 'm!

  • GoodspeeD
  • Registratie: April 2002
  • Laatst online: 13:29
TimMer schreef op 03 December 2002 @ 01:32:
[...]

Bij deze :) :
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?
mysql_connect("localhost", "user", "password");
mysql_select_db("database");
$paginaresult = mysql_query("SELECT * FROM table1"); 
while ($rij=mysql_fetch_object($paginaresult)) { 
$column1 ="$rij->column1";
$column1 .="$rij->column2";
$column1 = substr($column1, 1);
$fullstring ="sting";
$fullstring .="$column1"; 
mysql_query("INSERT into table2 (ncolumn1,ncolumn2,ncolumn3,ncolumn4,ncolumn5)
values ('$fullstring','$rij->column3','$rij->column4','$rij->column5','$rij->column6','$rij->column7')");
} 
?>
Het kan aan mij liggen, maar ik zie niet echt waarom deze code het afsplitst per 1000 records?

Acties:
  • 0 Henk 'm!

  • GoodspeeD
  • Registratie: April 2002
  • Laatst online: 13:29
het probleem met php blijft gewoon dat je scripts niet te lang mogen duren. Dus wat je zou kunnen doen is een php filetje maken die zich zelf aanroept met als parameter een waarde voor $i.

dus bijf. self.php?i='bepaald getal' en dan aan de hand van dat getal beginnen in je tabel en dat getal dus ophogen. duizend records verwerken en dan het script opnieuw aanroepen.

Ik weet alleen niet zeker of dit wel mogelijk is, omdat de php engine waarschijnlijk intelligent genoeg is om te zien dat het de hele tijd hetzelfde script is wat aan de praat is.

Dus dan krijg je iets als:

blegh.php
PHP:
1
2
3
4
5
spring naar positie $i in de tabel als die geset is
for ($k=0;$k<1000;$k++) {
verwerk record;
}
roep blegh.php?i=$i+1000;

[ Voor 16% gewijzigd door GoodspeeD op 03-12-2002 10:50 ]


Acties:
  • 0 Henk 'm!

  • intermusic
  • Registratie: September 2002
  • Laatst online: 25-03 14:05

intermusic

Marc Hoekstra

Misschien is het slim om het zo te doen:

Je pakt het aantal records in je database.
Je stelt een limiet in van misschien 1000 te verwerken records.
Wanneer php 1000 records verwerkt heeft verstuur je met behulp van een flush() een refresh naar je pagina toe naar het zelfde script en het aantal reeds verwerkte records, zodat het script opnieuw geladen wordt en verder gaat.
Zo voorkom je in ieder geval dat je timeouts krijgt, zonder dat je iedere keer op een knopje moet drukken ofzo.

(denk erom dat voordat de flush werkt je eerst 300 bytes aan data mee moet geven (300 *   BV))

Ik hoop dat je hier wat aan hebt

Acties:
  • 0 Henk 'm!

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 10-09 15:51

thomaske

» » » » » »

zoals dusty en ACM al hebben aangegeven:
dit kan je makkelijk oplossen zonder php
Select Into
String functions

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

thomaske schreef op 03 December 2002 @ 11:11:
zoals dusty en ACM al hebben aangegeven:
dit kan je makkelijk oplossen zonder php
Select Into
String functions
Eens maar ik zou het toch echt wel met een alter table doen, en daar na een update, ik denk dat het sneller is simpeler is.

Programmer - an organism that turns coffee into software.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
LuCarD schreef op 03 december 2002 @ 14:38:
[...]


Eens maar ik zou het toch echt wel met een alter table doen, en daar na een update, ik denk dat het sneller is simpeler is.
Jeps, dit werkt inderdaad super :P

De overige deden het ook wel maar waren inderdaad een stuk trager !!!

Acties:
  • 0 Henk 'm!

  • TimMer
  • Registratie: Februari 2000
  • Niet online
Uhmmm, vrienden, ik heb alleen de eerder geplaatste code in php-tags gezet; ik heb er niets aan veranderd. :{

Men gaf alleen aan dat het handiger te lezen was tussen tags, dus ik dacht: "Laat ik even behulpzaam zijn."; word ik gelijk afgefikt op mijn niet bestaande PHP-talenten. :'(

Ik kan het hooguit een beetje lezen, schrijven kan ik het niet. Ik werk er nooit mee.

Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 06-09 02:30

dusty

Celebrate Life!

LuCarD schreef op 03 december 2002 @ 14:38:
[...]
Eens maar ik zou het toch echt wel met een alter table doen, en daar na een update, ik denk dat het sneller is simpeler is.

Maar het is ook minder veilig. Immers als je de table verkeerd aanpast kan je je backup gaan terugzetten.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR

Pagina: 1