免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8588 | 回复: 7
打印 上一主题 下一主题

Mysql+PHP存储过程效率测试,结果大跌眼镜… [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-21 11:24 |只看该作者 |倒序浏览
mysql 5.0以后支持存储过程了,我想看一下存储过程是不是比常规方法更快…所以做了这个的测试,如果此过程有所疏失,烦请指教。

我先用建了这个存储过程,来生成一万条记录的表。
  1. create procedure randtest(param int)
  2. begin
  3.         declare v int default 1;
  4.         TRUNCATE TABLE randtest;
  5.         while (v<=param) do
  6.             insert into randtest values(v,rand()*10000);
  7.             set v=v+1;
  8.         end while;
  9.     end
复制代码


call randtest(10000);        生成1万条记录的表

select * from randtest order by rand() limit 0,10;
就用这条语句来测试,随机取10条乱序记录。
一个用存储过程来做,一个用PHP来读取。为公平起见,每次执行存储过程均取10条记录,
并由PHP记录相关数据后,继续执行下一次搜索,暂定搜索100次,比比时间。

这就是测试用的存储过程,比较简单。
  1. CREATE PROCEDURE `gettest`()
  2. begin
  3.         select * from randtest order by rand() limit 0,10;
  4. end;
复制代码


test1.php 常规方法读取

  1. <?
  2.         /*执行时间大约为1.62s左右*/
  3.         #注释部分,存储过程效率测试1
  4. ?>
  5. <?
  6.         /*连接数据库*/
  7.         define('CLIENT_MULTI_RESULTS', 131072);
  8.         $conn = mysql_connect("127.0.0.1", "upguard", "testtest",1,CLIENT_MULTI_RESULTS) or die("Could not connect: ".mysql_error());
  9.         mysql_select_db("testdb") or die ("Cannot select database!");
  10. ?>

  11. <?
  12.         /*定义变量*/
  13.         $dispid="";
  14.         $disp="";
  15.         $starttime=time()+microtime();
  16.         $loop=100;
  17. ?>

  18. <?
  19.         for(;$loop>=0;$loop--) {
  20.                 $result=mysql_query("select * from randtest order by rand() limit 10;") or die("Query failed:" .mysql_error());
  21.        
  22.           while($row = mysql_fetch_array($result, MYSQL_ASSOC))
  23.           {
  24.                   $dispid.=$row["ID"].",";
  25.                   $disp.=$row["randed"].",";
  26.           }
  27.           $dispid.="<br/>\n";
  28.           $disp.="<br/>\n";
  29.         }
  30.   
  31.   echo "<br/><br/><font color=red>".strval(time()+microtime()-$starttime)."s</font><br/><br/>";
  32.   echo $dispid."<br/><br/>".$disp;
  33.   
  34.   mysql_free_result($result);
  35. ?>

  36. <?
  37.         /*关闭数据连接*/
  38.         mysql_close($conn);
  39. ?>
复制代码


test2.php
非常郁闷…存储过程执行的时候有一些问题存在,只能够改成重新连接数据库再进行运行存储过程,如果有哪位知道解决的方法,也希望不吝赐教,谢谢。
  1. <?
  2.         /*执行时间1.84s左右*/
  3.         #注释部分,存储过程效率测试2
  4.         #疯掉,循环执行存储过程的时候有错误…Commands out of sync
  5.         #没办法,重新连接一百次吧……我再去改原来的测试程序!
  6. ?>
  7. <?
  8.         /*连接数据库*/
  9.         define('CLIENT_MULTI_RESULTS', 131072);
  10. ?>

  11. <?
  12.         /*定义变量*/
  13.         $dispid="";
  14.         $disp="";
  15.         $starttime=time()+microtime();
  16.         $loop=100;
  17. ?>

  18. <?

  19.         for(;$loop>=0;$loop--) {
  20.                 $conn = mysql_connect("127.0.0.1", "upguard", "testtest",1,CLIENT_MULTI_RESULTS) or die("Could not connect: ".mysql_error());
  21.                 mysql_select_db("testdb") or die ("Cannot select database!");

  22.                 $result=mysql_query("call gettest();") or die("Query failed:" .mysql_error());
  23.           while($row = mysql_fetch_array($result, MYSQL_ASSOC))
  24.           {
  25.                   $dispid.=$row["ID"].",";
  26.                   $disp.=$row["randed"].",";
  27.           }
  28.           $dispid.="<br/>\n";
  29.           $disp.="<br/>\n";
  30.   mysql_free_result($result);
  31.         mysql_close($conn);
  32.         }
  33.   
  34.   echo "<br/><br/><font color=red>".strval(time()+microtime()-$starttime)."s</font><br/><br/>";
  35.   echo $dispid."<br/><br/>".$disp;
  36. ?>

  37. <?
  38.         /*关闭数据连接*/
  39. ?>
复制代码


test3.php
既然上面的程序改了,常规方式读取也需要改吧?改成和test2一样的过程…

  1. <?
  2.         /*执行时间1.82左右*/
  3.         #注释部分,存储过程效率测试3
  4.         #疯掉,循环执行存储过程的时候有错误…Commands out of sync
  5.         #没办法,重新连接一百次吧……我再去改原来的测试程序!这里是连接、断开mysql,100次
  6. ?>
  7. <?
  8.         /*连接数据库*/
  9.         define('CLIENT_MULTI_RESULTS', 131072);
  10. ?>

  11. <?
  12.         /*定义变量*/
  13.         $dispid="";
  14.         $disp="";
  15.         $starttime=time()+microtime();
  16.         $loop=100;
  17. ?>

  18. <?

  19.         for(;$loop>=0;$loop--) {
  20.                 $conn = mysql_connect("127.0.0.1", "upguard", "testtest",1,CLIENT_MULTI_RESULTS) or die("Could not connect: ".mysql_error());
  21.                 mysql_select_db("testdb") or die ("Cannot select database!");

  22.                 $result=mysql_query("select * from randtest order by rand() limit 10;") or die("Query failed:" .mysql_error());
  23.           while($row = mysql_fetch_array($result, MYSQL_ASSOC))
  24.           {
  25.                   $dispid.=$row["ID"].",";
  26.                   $disp.=$row["randed"].",";
  27.           }
  28.           $dispid.="<br/>\n";
  29.           $disp.="<br/>\n";
  30.   mysql_free_result($result);
  31.         mysql_close($conn);
  32.         }
  33.   
  34.   echo "<br/><br/><font color=red>".strval(time()+microtime()-$starttime)."s</font><br/><br/>";
  35.   echo $dispid."<br/><br/>".$disp;
  36. ?>

  37. <?
  38.         /*关闭数据连接*/
  39. ?>
复制代码



非常郁闷…使用存储过程的反而用时更多?到底是什么原因?是不是因为查询语句较简单?无法体现出存储过程的优越性?一大堆疑问,希望各位能够帮我解答,谢谢。

论坛徽章:
0
2 [报告]
发表于 2008-05-21 11:37 |只看该作者
存储过程的有点在于批量处理,然后减少客户端与数据库端的通讯。

不过你的SQL 语句也不是最优的。

论坛徽章:
0
3 [报告]
发表于 2008-05-21 12:10 |只看该作者
当然,我的目的就是想使用同样的语句来看一下效果,你的意思是不是对于简单的操作比如单纯的select还是不使用存储过程的好?

论坛徽章:
0
4 [报告]
发表于 2008-05-21 12:37 |只看该作者
简单的SQL 语句用存储过程比单纯用SQL 语句从性能上讲没有多大区别。

论坛徽章:
0
5 [报告]
发表于 2008-05-21 16:20 |只看该作者
尽量少用 order by rand(),会让你疯掉的

论坛徽章:
0
6 [报告]
发表于 2008-05-21 16:58 |只看该作者
呵,用order by rand() 就是为了让执行时间长一点,呵。

我本来想试试存储过程到底有多好的…结果……等有复杂一点的查询或更新再用它吧!

论坛徽章:
0
7 [报告]
发表于 2008-05-21 21:45 |只看该作者
原帖由 yejr 于 2008-5-21 16:20 发表
尽量少用 order by rand(),会让你疯掉的


  赞同, 有些场合会逼着用order by ,没办法!当然order by rand() 是有点夸张。

[ 本帖最后由 system888net 于 2008-5-21 22:05 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2008-05-21 21:48 |只看该作者
原帖由 yueliangdao0608 于 2008-5-21 11:37 发表
存储过程的有点在于批量处理,然后减少客户端与数据库端的通讯。

不过你的SQL 语句也不是最优的。


赞同这句话: "存储过程的有点在于批量处理,然后减少客户端与数据库端的通讯"
procedure 不是在什么情况下都会快.

[ 本帖最后由 system888net 于 2008-5-21 21:53 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP