Thinkphp 从数据库中取出3000行数据 耗时23秒

lsmir2 2015-05-25 01:59:34
运行时间 : 23.5581s ( Load:0.0098s Init:0.0020s Exec:23.4604s Template:0.0859s )
吞吐率 : 0.04req/s
内存开销 : 11,101.20 kb



$sql = "SELECT TOP(3000)* from TUsers";
$model = M();
$this->assign('res', $model->query($sql));]

我已经被人鄙视了。输出个信息 要等这么久。
...全文
983 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
yaofare 2018-01-05
  • 打赏
  • 举报
回复
引用 9 楼 lsmir2 的回复:
[quote=引用 8 楼 meiyaxiong 的回复:] $res=M('TUsers')->field("你所需要的字段1,你所需要的字段2.。。")->limit(3000)->select(); 这样写试试看
其实我语句是这么写的 SELECT T.UserID,T.UserName,TUP.WalletMoney,TUP.BankMoney,T.RegDate,TUP.GameLevel,Test.LoginCount,Online.OnLineTime,Tool.PayMoneySum FROM dbo.TUsers AS T LEFT JOIN TUserProperty AS TUP ON TUP.UserID = T.UserID LEFT JOIN (SELECT UserID,COUNT(UserID)AS LoginCount from Bzw_PLogUsersLoginNoIpLimit GROUP BY UserID) AS Test ON Test.UserID=T.UserID LEFT JOIN (SELECT UserID,SUM(OnLineTime) as OnLineTime from TRoomRecord GROUP BY UserID ) AS Online on T.UserID=Online.UserID INNER JOIN Tool_User AS Tool ON T.UserID=Tool.UserID WHERE t.UserType=1005 AND RegDate BETWEEN '2015-05-01' AND '2015-05-27' 所以你懂的。 最开始 那个SELECT TOP(3000)* from TUsers 只似乎举例啊 [/quote]其实我觉得不要写太风骚的sql啊 统一查出来用php在处理数据都行啊 我就是这样坑了好几次
lsmir2 2017-09-11
  • 打赏
  • 举报
回复
ob_start(); ..... ..... $out = ob_get_contents(); ob_end_clean(); echo $out; 解决问题
ohmygirl 2015-05-31
  • 打赏
  • 举报
回复
function test(int){ } DOM操作自然是耗时的,你3000行数据就执行了3000次html()操作,很慢也是在意料之中的。 建议合并数据之后执行html,例如: var htm = ''; for( i = 0 ; i<3000 ; i++){ htm += '<tr><td></td></tr>'; } $("#s1").html(htm); 可以对比一下这种方式与你原来的方式的效率差别。
lsmir2 2015-05-31
  • 打赏
  • 举报
回复
不能编辑帖子 <table id="s1"></table>
lsmir2 2015-05-31
  • 打赏
  • 举报
回复
引用 15 楼 nowphp 的回复:
估计时间是耗在连接数据库上面了。
我用6年前的笔记本试了下 运行时间 : 247.5251s ( Load:0.0088s Init:0.0010s Exec:247.4314s Template:0.0840s ) 不是TP的问题 是HTML的性能 我们可以做个最简单的测试 js 循环输出 3000 行信息 机器好的输出8000行看看吧 js部分 自行导入jq

function test(int) {
    for (i = 0; i <= int; i++) {
      $("#s1").html("<tr><td>序号</td><td>用户ID</td><td>用户帐号</td><td>金币</td><td>等级</td><td>登陆次数</td><td>在线时长</td><td>冲值总计</td></tr>");
     }
 }

<table id="test"></table>
<script>
test(3000);
</script>
lsmir2 2015-05-31
  • 打赏
  • 举报
回复
引用 14 楼 nowphp 的回复:
你连服务器数据库要多久时间,有看吗?
SELECT T.UserID,T.UserName,TUP.WalletMoney,TUP.BankMoney,T.RegDate,TUP.GameLevel,Test.LoginCount,Online.OnLineTime,Tool.PayMoneySum FROM dbo.TUsers AS T LEFT JOIN TUserProperty AS TUP ON TUP.UserID = T.UserID LEFT JOIN (SELECT UserID,COUNT(UserID)AS LoginCount from Bzw_PLogUsersLoginNoIpLimit GROUP BY UserID) AS Test ON Test.UserID=T.UserID LEFT JOIN (SELECT UserID,SUM(OnLineTime) as OnLineTime from TRoomRecord GROUP BY UserID ) AS Online on T.UserID=Online.UserID INNER JOIN Tool_User AS Tool ON T.UserID=Tool.UserID WHERE t.UserType=1005 AND RegDate BETWEEN '2015-05-01' AND '2015-05-31' [ RunTime:0.271495s ] SELECT T.UserID,T.UserName,OD.OrdersNo,OD.TPOrders,OD.DoneDate,OD.ActualMoney,OD.TypeInfo FROM TUsers AS T INNER JOIN dbo.Bzw_WOrders AS OD ON T.UserID = OD.TUsersID WHERE t.UserType = 1005 AND OD.DoneDate BETWEEN '2015-05-01' AND '2015-05-31' AND OD.IsDone=1 ORDER BY DoneDate [ RunTime:0.048830s ] 真的不是sql的问题啊
深圳phper 2015-05-27
  • 打赏
  • 举报
回复
估计时间是耗在连接数据库上面了。
深圳phper 2015-05-27
  • 打赏
  • 举报
回复
你连服务器数据库要多久时间,有看吗?
__小帅 2015-05-27
  • 打赏
  • 举报
回复
首先要理解tp是什么 他是一个框架,然后根据指令去生成SQL语句,然后去执行 目测你并没有用他的自动生成SQL语句功能 而是自己写的sql语句 那么就要从自身的sql语句中找问题 top是函数 还是top(3000) 难道你不知道,sql查询的禁忌是最好不用函数吗?
lsmir2 2015-05-27
  • 打赏
  • 举报
回复
我怀疑是生成 html 耗时太多了。真的跟SQL无关好吗。 查询个3000条数据。一直在扯SQL 我也是无语了。 不用框架 var_dump(3000行数据的数组); var_dump(1W行数据的数组); 然后也要很多时间的。
lsmir2 2015-05-26
  • 打赏
  • 举报
回复
引用 8 楼 meiyaxiong 的回复:
$res=M('TUsers')->field("你所需要的字段1,你所需要的字段2.。。")->limit(3000)->select(); 这样写试试看
其实我语句是这么写的 SELECT T.UserID,T.UserName,TUP.WalletMoney,TUP.BankMoney,T.RegDate,TUP.GameLevel,Test.LoginCount,Online.OnLineTime,Tool.PayMoneySum FROM dbo.TUsers AS T LEFT JOIN TUserProperty AS TUP ON TUP.UserID = T.UserID LEFT JOIN (SELECT UserID,COUNT(UserID)AS LoginCount from Bzw_PLogUsersLoginNoIpLimit GROUP BY UserID) AS Test ON Test.UserID=T.UserID LEFT JOIN (SELECT UserID,SUM(OnLineTime) as OnLineTime from TRoomRecord GROUP BY UserID ) AS Online on T.UserID=Online.UserID INNER JOIN Tool_User AS Tool ON T.UserID=Tool.UserID WHERE t.UserType=1005 AND RegDate BETWEEN '2015-05-01' AND '2015-05-27' 所以你懂的。 最开始 那个SELECT TOP(3000)* from TUsers 只似乎举例啊
meiyaxiong 2015-05-26
  • 打赏
  • 举报
回复
$res=M('TUsers')->field("你所需要的字段1,你所需要的字段2.。。")->limit(3000)->select(); 这样写试试看
lsmir2 2015-05-26
  • 打赏
  • 举报
回复
引用 6 楼 meiyaxiong 的回复:
[quote=引用 4 楼 lsmir2 的回复:] [quote=引用 3 楼 jam00 的回复:] EXPLAIN 看看效率或者改为 LIMIT 0,3000
sql 0.6秒就出结果了 问题在PHP 上面[/quote] 不一定 可能是sql自带的缓存使他速度变快[/quote] 取出3000多行的数据 [ RunTime:0.226548s ] 还有一个取订单的[ RunTime:0.016600s ]1000多行 运行时间 : 22.5562s ( Load:0.0098s Init:0.0020s Exec:22.4556s Template:0.0889s ) Exec:22.4556s 这里占用了大量的时间
meiyaxiong 2015-05-26
  • 打赏
  • 举报
回复
引用 4 楼 lsmir2 的回复:
[quote=引用 3 楼 jam00 的回复:] EXPLAIN 看看效率或者改为 LIMIT 0,3000
sql 0.6秒就出结果了 问题在PHP 上面[/quote] 不一定 可能是sql自带的缓存使他速度变快
Dleno 2015-05-26
  • 打赏
  • 举报
回复
执行一个最最简单的语句看看,需要的时间是否正常? 不正常的话,就是与数据库服务器之间的问题。。 正常的话,你就只能优化你的语句了。 SELECT T.UserID,T.UserName,TUP.WalletMoney,TUP.BankMoney,T.RegDate,TUP.GameLevel,Test.LoginCount,Online.OnLineTime,Tool.PayMoneySum FROM dbo.TUsers AS T LEFT JOIN TUserProperty AS TUP ON TUP.UserID = T.UserID LEFT JOIN (SELECT UserID,COUNT(UserID)AS LoginCount from Bzw_PLogUsersLoginNoIpLimit GROUP BY UserID) AS Test ON Test.UserID=T.UserID LEFT JOIN (SELECT UserID,SUM(OnLineTime) as OnLineTime from TRoomRecord GROUP BY UserID ) AS Online on T.UserID=Online.UserID INNER JOIN Tool_User AS Tool ON T.UserID=Tool.UserID WHERE t.UserType=1005 AND RegDate BETWEEN '2015-05-01' AND '2015-05-27' 你这个语句一看效率就不会高,数据越大效率越低
xuzuning 2015-05-26
  • 打赏
  • 举报
回复
既然 sql 0.6秒就出结果了 自然是你在生成 html 时计算太多了 不过你一下给用户 3000 行数据,谁有耐心去看呢?也不分个页
果酱很好吃 2015-05-25
  • 打赏
  • 举报
回复
那就不知道了,没玩过tp,不知道底层怎么写的
lsmir2 2015-05-25
  • 打赏
  • 举报
回复
引用 3 楼 jam00 的回复:
EXPLAIN 看看效率或者改为 LIMIT 0,3000
sql 0.6秒就出结果了 问题在PHP 上面
果酱很好吃 2015-05-25
  • 打赏
  • 举报
回复
EXPLAIN 看看效率或者改为 LIMIT 0,3000
lsmir2 2015-05-25
  • 打赏
  • 举报
回复
引用 1 楼 jam00 的回复:
用的不是mysql?top好像是mssql里面的吧
嗯 是SQL Server
加载更多回复(1)

20,359

社区成员

发帖
与我相关
我的任务
社区描述
“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法利用了C、Java和Perl,该语言的主要目标是允许web开发人员快速编写动态网页。
phpphpstorm 技术论坛(原bbs)
社区管理员
  • 开源资源社区
  • phpstory
  • xuzuning
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧