webForumDet fria alternativet

Slå samman data från olika tabeller, servrar

PHP

3 svar · 630 visningar · startad av oskob

Medlem sedan maj 20021 558 inlägg
Frågan#1

Halloj!

Hur löser man detta på snabbast möjliga vis:

Jag har ett antal tabeller på olika servrar som har exakt samma struktur.
Nu vill jag hämta information från alla tabeller och slå ihop till en chache-tabell som innehåller all data från alla olika tabeller.

Det första jag kom på var att loopa igenom varje rad i varje tabell med php och göra en insert per rad till chache-tabellen. Det rör sig om ett par hundratusentals rader så det blir en himla massa anrop.

En annan liten fundering jag hade var om det är smidigare att "batcha" ihop ett par inserts i taget för att få färre anrop till databasen. Att man alltså i PHP buntar ihop säg 100 inserts åt gången och skickar till databasen. Skulle det bli snabbare tro? Jag testade att klämma in allt till en gigantisk sql-sats men då exploderade servern (ganska förståeligt).

Den smidigaste lösningen skulle ju vara en union av något slag men jag skulle tippa på att MySQL inte kan fixa detta över olika servrar?

Sen en liten fundering om det här med strängar:
Jag vet att det är så i Java att om man har en sträng "abc" och plussar på den så den blir "abcdef" så sparas både "abc" och "abcdef" på minnet. Om det är så i php betyder ju det att de här sql-strängarna blir dubblerade för varje gång. Kan man "deallocata" de gamla strängarna på något sätt?

Det var allt för idag! Tack på förhand!

Medlem sedan mars 20041 505 inlägg
#2

Det smidigaste alternativet borde väl vara att bygga ett program på servern som med jämna mellanrum trycker ihop alla tabeller till en enda stor tabell, som indexeras på ett optimalt sätt.
Nackdelen blir ju att man inte får tillgång till data som är aktuell just för ögonblicket.
Hur ofta sammanslagningen ska utföras beror ju på vad det är för typ av data och hur ofta det sker uppdateringar.

Medlem sedan maj 20021 558 inlägg
#3

Det är precis det jag ska göra fast i script-form :) Det ska ske så ofta som möjligt. Just nu tar scriptet 43 sekudner att exekvera så då går det ju inte att köra det speciellt ofta. Jag håller på med att göra så att den endast hämtar nya rader så det kommer ju bli oerhört mycket mindre i och med det. Men rent teoretiskt, vilket går snabbast av dessa två:

$sql = "
insert into Table values (null, 1, "hej", 5443.22);
insert into Table values (null, 1, "hej", 5443.22);
insert into Table values (null, 1, "hej", 5443.22);
insert into Table values (null, 1, "hej", 5443.22);
";
mysql_query($sql);
$sql = "insert into Table values (null, 1, "hej", 5443.22)"
mysql_query($sql);
$sql = "insert into Table values (null, 1, "hej", 5443.22)"
mysql_query($sql);
$sql = "insert into Table values (null, 1, "hej", 5443.22)"
mysql_query($sql);
$sql = "insert into Table values (null, 1, "hej", 5443.22)"
mysql_query($sql);

Mitt sunda förnuft säger mig att det första exemplet borde gå snabbare men är det så i verkligheten?

Medlem sedan maj 20021 558 inlägg
#4

Nu har jag utfört lite tester jag tänkte dela med mig av om någon är intresserad.

Det snabbaste sättet jag kom fram till var att inserta 100 rader åt gången såhär:

insert into Table (Ett,Tva,Tre,Fyra,Fem) values
     ('ett','två','tre','fyra','fem'),
     ('ett','två','tre','fyra','fem'), 
     ('ett','två','tre','fyra','fem') ...

Buntade man ihop fler än 100 rader verkar det bli jobbigare för php att hantera den gigantiska strängen som blir än vad man tjänar på i mysql-anrop.
Detta sätt var ganska exakt 3 gånger snabbare än att göra ett anrop per rad.

Hoppas någon tyckte det var lika intressant som jag!

257 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
119 ms — ändringar (db)