2017-08-06 138 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值。 –