2012-12-26 78 views
0

我有這臺服務器設置一個實時流量日誌數據庫,它包含一個大的統計表。現在我需要從它創建一個更小的表格,比如說30天前。SQL選擇查詢內存問題

該服務器還有一個從服務器,用於複製數據並在主服務器後面5秒。 我創建了該從站,以減少選擇查詢的服務器進程,因此只能在插入/更新通信日誌時使用。

現在我需要的最後一天複製到較小的表,但仍不能使用「真正的」 DB, 所以我需要從從選擇並插入到真正的小桌子。 (從站只允許讀取操作)。

我正在使用PHP,我無法用一個查詢在一個查詢中使用兩個不同的數據庫解決此問題...如果可能,請告訴我如何?

當使用兩個查詢時,我需要把最後一天作爲PHP MySQL對象。對於300K-650K的行,它開始成爲緩存內存問題。我會使用通過ID部分選擇(通過設置在哪裏術語ids)塊,但我沒有一個自動增量id字段,並沒有行的id(當存儲交通數據id會佔用大量的空間) 。

所以我想這個想法,我想獲得第二個意見。

如果我將立即採取最後一天(300K行),將會使PHP內存過載。 我可以使用限制塊,或一個新的想法:一次選擇一個列,並將其複製到新的真實表。但我不知道第二種方法是否可行。插入查看列級別或行級別的第一個開放空間嗎? 的主要想法是減少選擇的大小..所以有可能建立一個按列選擇,然後插入他們作爲列在MySQL?

+2

爲什麼你談論你的表,就好像他們是人? 0_0 – 2012-12-26 13:49:48

+3

@JackManey:因爲英語不是Amir的母語,某些語言的直接音譯會使用'他'或'她'代替中性'it'。 –

回答

0

如果這僅僅是PHP中的內存問題,那麼您可以嘗試使用PDO並一次獲取1個結果行,而不是同時獲取所有行。

PHP.net爲PDO:

<?php 
function getFruit($conn) { 
    $sql = 'SELECT name, color, calories FROM fruit ORDER BY name'; 
    foreach ($conn->query($sql) as $row) { 
     print $row['name'] . "\t"; 
     print $row['color'] . "\t"; 
     print $row['calories'] . "\n"; 
    } 
} 
?> 
+0

好吧,這裏是PHP開始怪異的地方..我採取了你的建議,並開始使用數據塊。我使用了一個循環來提高2000行跳躍的極限。但有趣的是,當我開始使用php內存使用和內存峯值功能時,我發現chunks方法在大規模和循環中不起作用的原因是因爲將新值設置爲var不會釋放內存在新的設置之前,所以你必須使用unset或null,以保持你的記憶在PHP, –

0

以及這裏是PHP的開始是怪異。我把你的意見,並開始用大塊的數據。我使用了一個循環來提高2000行跳躍的極限。但有趣的是,當我開始使用php內存使用和內存峯值功能時,我發現chunks方法在大規模和循環中不起作用的原因是因爲將新值設置爲var不會釋放內存之前的新設置..所以你必須使用未設置或爲了保持你的記憶在PHP, -