2017-08-06 55 views
-1

我有一個簡單的問題或問題,我無法得到我的生活。我在PHP中有一個MYSQL查詢,但它永遠需要加載看起來正在訪問的數據庫持有許多行1千多個。使用下面的當前腳本,它將在大約25秒內加載,並且有6,000行。MYSQL PHP查詢時間過長

$SQLGetUsers = $odb -> query("SELECT m.id,m.userid,m.btc,m.unpaidbtc,m.addedbtc,m.ltc,m.unpaidltc,m.addedltc,m.totalbtcmined,m.totalltcmined,u.totalbtcreward,u.totalltcreward, SUM(r.totalbtcdeposited) AS value_sum1, SUM(r.totalltcdeposited) AS value_sum2 
    FROM miner m 
    LEFT JOIN users u ON m.userid = u.ID 
    LEFT JOIN referrals r ON m.userid = r.refid "); 

while ($getInfo = $SQLGetUsers -> fetch(PDO::FETCH_ASSOC)) 
{ 
    $ID = $getInfo['id']; 
    $userid = $getInfo['userid']; 
    $totalbtc = $getInfo['btc']; 
    $totalunpaidbtc = $getInfo['unpaidbtc']; 
    $addedbtc = $getInfo['addedbtc']; 
    $totalltc = $getInfo['ltc']; 
    $totalunpaidltc = $getInfo['unpaidltc']; 
    $addedltc = $getInfo['addedltc']; 
    $totalbtcmined = $getInfo['totalbtcmined']; 
    $totalltcmined = $getInfo['totalltcmined']; 

    /////////////////////////////////////////////// 

    $newBTCbalance = ($totalbtc); 

    $btctoadd = number_format($newBTCbalance/45/24/60/60 * 3, 10); 
    $newbtcvalue = $totalunpaidbtc + $btctoadd; 
    $odb->exec("UPDATE miner SET addedbtc = '$btctoadd', unpaidbtc = '$newbtcvalue' WHERE `id` = '$ID'"); 

    $newLTCbalance = ($totalltc); 

    $ltctoadd = number_format($newLTCbalance/45/24/60/60 * 3, 10); 
    $newltcvalue = $totalunpaidltc + $ltctoadd; 
    $odb->exec("UPDATE miner SET addedltc = '$ltctoadd', unpaidltc = '$newltcvalue' WHERE `id` = '$ID'"); 

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 

    $minedbtc = $btctoadd + $totalbtcmined; 
    $minedltc = $ltctoadd + $totalltcmined; 
    $odb->exec("UPDATE miner SET totalbtcmined = '$minedbtc', totalltcmined = '$minedltc' WHERE `id` = '$ID'"); 
} 

我不知道我能做些什麼來加快查詢速度,因此它運行時間少於1秒,甚至有可能嗎?那麼反正任何人都可以幫助這個運行更快?

+1

幾件事情在這裏。首先,你要更新同一個礦工3次。爲什麼不一次只做1次更新?其次,在MySQL中,用查詢前面的'EXPLAIN'運行查詢。即:'解析SELECT m.id,...'並將其添加到你的問題中,因爲可能有些東西你可以在那裏改進(索引方式) – Tom

+1

只是要拋出這個問題,你應該使用預處理語句來避免SQL注射。特別是考慮到你在做一些與貨幣有關的事情,所以你是一個更大的目標。 –

+0

你應該幫助我們來幫助你。刪除我們不需要的所有代碼。然後請做一些調試:查詢是否慢(在客戶端運行)?如果是這樣,我們只需要看看sql。添加說明和數據庫方案。查詢是否正常,但網站建設速度慢?等等。不要隨意把所有的代碼放在這裏,而只是一個小例子(例如,試着去除所有的增加,如果它並不重要,那麼我們並不需要看到這些,我們呢?) – Nanne

回答

0

解決此問題的最佳方法是使用LIMIT子句。

https://dev.mysql.com/doc/refman/5.7/en/limit-optimization.html

讓說你有一個查詢,列出所有的博客文章,你有超過1萬職位查詢將採取年齡來執行。通常人們使用LIMIT子句從MySQL數據庫獲取一定數量的數據並創建分頁。

$query = $query->query("SELECT * FROM data LIMIT 10"); // Only get 10 data from query 

$query = $query->query("SELECT * FROM data LIMIT 10 OFFSET 10"); // The data from index 9 will be retrived make the OFFSET value dynamic 
+0

我已經知道它,但如果它正在查找的數據超過10行,LIMIT將如何提供幫助?難道它從來沒有做過任何事情嗎?看起來它不能通過6000行? – TymeBomb

+0

使用帶限位的OFFSET。 –

+0

檢索什麼類型的數據?我的意思是這是一個登錄數據/博客文章/評論?是的@ Meezaan-ud-Din的想法很好,你可以創建一個動態的OFFSET值。 –