3 回答

TA貢獻(xiàn)1765條經(jīng)驗(yàn) 獲得超5個(gè)贊
該P(yáng)DO::ATTR_PERSISTENT值不是布爾值。它標(biāo)識正在使用的連接,對多個(gè)連接使用唯一值。就我而言:
$db = new PDO("mysql:host=".$dbhost.";dbname=".$dbname, $dbuser, $dbpass, array(PDO::ATTR_PERSISTENT => 'unbuff', PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => false));
$db_ub = new PDO("mysql:host=".$dbhost.";dbname=".$dbname, $dbuser, $dbpass, array(PDO::ATTR_PERSISTENT => 'buff', PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true));

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超3個(gè)贊
難道你不能通過簡單地運(yùn)行一個(gè)查詢來擺脫大部分代碼:
?INSERT IGNORE INTO newtable
? ? ?SELECT? ...,
? ? ? ? ? ? ?IF(..., 5, 4)
? ? ? ? ?FROM oldtable WHERE ...;
這樣,您就可以擺脫 7G 內(nèi)存問題。
如果結(jié)果證明一次做太多,那就把它分成塊。
另一個(gè)話題:為什么select somedata from users limit 1在循環(huán)內(nèi)執(zhí)行?似乎每次都得到相同的數(shù)據(jù)。此外,如果沒有ORDER BY,您將無法預(yù)測limit 1您將獲得哪一行。

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
您實(shí)際上是在進(jìn)行 135000000 次查詢,而不是迭代 135000000 個(gè)對象。
將代碼更改為僅執(zhí)行一個(gè)查詢,但對元素進(jìn)行排序,就好像它們在您的 for 循環(huán)中一樣。
$db = new PDO("mysql:host=".$dbhost.";dbname=".$dbname, $dbuser, $dbpass, array(PDO::ATTR_PERSISTENT => true));
$stmt = $db->prepare('SELECT * FROM stats ORDER BY id ASC');
$stmt->execute();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
// ...
}
你甚至不需要這個(gè)if,它是數(shù)據(jù)庫本身可以更快使用的邏輯:
如果(!empty($row['id'])) {
反而:
SELECT * FROM stats WHERE id IS NOT NULL ORDER BY id ASC
我有一段時(shí)間沒有研究 PDO/MySQL,但我假設(shè) unbuffered 允許你使用游標(biāo):
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
考慮到每個(gè)連接只能激活一個(gè)查詢。您基本上是在使用連接的緩沖區(qū)。
更好的選擇是在 map reduce 中只加載小塊。
SELECT * FROM stats LIMIT 100, 0
使用結(jié)果,然后
SELECT * FROM stats LIMIT 100, 100
- 3 回答
- 0 關(guān)注
- 335 瀏覽
添加回答
舉報(bào)