- 论坛徽章:
- 0
|
mysql 5.0以后支持存储过程了,我想看一下存储过程是不是比常规方法更快…所以做了这个的测试,如果此过程有所疏失,烦请指教。
我先用建了这个存储过程,来生成一万条记录的表。
- create procedure randtest(param int)
- begin
- declare v int default 1;
- TRUNCATE TABLE randtest;
- while (v<=param) do
- insert into randtest values(v,rand()*10000);
- set v=v+1;
- end while;
- end
复制代码
call randtest(10000); 生成1万条记录的表
select * from randtest order by rand() limit 0,10;
就用这条语句来测试,随机取10条乱序记录。
一个用存储过程来做,一个用PHP来读取。为公平起见,每次执行存储过程均取10条记录,
并由PHP记录相关数据后,继续执行下一次搜索,暂定搜索100次,比比时间。
这就是测试用的存储过程,比较简单。
- CREATE PROCEDURE `gettest`()
- begin
- select * from randtest order by rand() limit 0,10;
- end;
复制代码
test1.php 常规方法读取
- <?
- /*执行时间大约为1.62s左右*/
- #注释部分,存储过程效率测试1
- ?>
- <?
- /*连接数据库*/
- define('CLIENT_MULTI_RESULTS', 131072);
- $conn = mysql_connect("127.0.0.1", "upguard", "testtest",1,CLIENT_MULTI_RESULTS) or die("Could not connect: ".mysql_error());
- mysql_select_db("testdb") or die ("Cannot select database!");
- ?>
- <?
- /*定义变量*/
- $dispid="";
- $disp="";
- $starttime=time()+microtime();
- $loop=100;
- ?>
- <?
- for(;$loop>=0;$loop--) {
- $result=mysql_query("select * from randtest order by rand() limit 10;") or die("Query failed:" .mysql_error());
-
- while($row = mysql_fetch_array($result, MYSQL_ASSOC))
- {
- $dispid.=$row["ID"].",";
- $disp.=$row["randed"].",";
- }
- $dispid.="<br/>\n";
- $disp.="<br/>\n";
- }
-
- echo "<br/><br/><font color=red>".strval(time()+microtime()-$starttime)."s</font><br/><br/>";
- echo $dispid."<br/><br/>".$disp;
-
- mysql_free_result($result);
- ?>
- <?
- /*关闭数据连接*/
- mysql_close($conn);
- ?>
复制代码
test2.php
非常郁闷…存储过程执行的时候有一些问题存在,只能够改成重新连接数据库再进行运行存储过程,如果有哪位知道解决的方法,也希望不吝赐教,谢谢。
- <?
- /*执行时间1.84s左右*/
- #注释部分,存储过程效率测试2
- #疯掉,循环执行存储过程的时候有错误…Commands out of sync
- #没办法,重新连接一百次吧……我再去改原来的测试程序!
- ?>
- <?
- /*连接数据库*/
- define('CLIENT_MULTI_RESULTS', 131072);
- ?>
- <?
- /*定义变量*/
- $dispid="";
- $disp="";
- $starttime=time()+microtime();
- $loop=100;
- ?>
- <?
- for(;$loop>=0;$loop--) {
- $conn = mysql_connect("127.0.0.1", "upguard", "testtest",1,CLIENT_MULTI_RESULTS) or die("Could not connect: ".mysql_error());
- mysql_select_db("testdb") or die ("Cannot select database!");
- $result=mysql_query("call gettest();") or die("Query failed:" .mysql_error());
- while($row = mysql_fetch_array($result, MYSQL_ASSOC))
- {
- $dispid.=$row["ID"].",";
- $disp.=$row["randed"].",";
- }
- $dispid.="<br/>\n";
- $disp.="<br/>\n";
- mysql_free_result($result);
- mysql_close($conn);
- }
-
- echo "<br/><br/><font color=red>".strval(time()+microtime()-$starttime)."s</font><br/><br/>";
- echo $dispid."<br/><br/>".$disp;
- ?>
- <?
- /*关闭数据连接*/
- ?>
复制代码
test3.php
既然上面的程序改了,常规方式读取也需要改吧?改成和test2一样的过程…
- <?
- /*执行时间1.82左右*/
- #注释部分,存储过程效率测试3
- #疯掉,循环执行存储过程的时候有错误…Commands out of sync
- #没办法,重新连接一百次吧……我再去改原来的测试程序!这里是连接、断开mysql,100次
- ?>
- <?
- /*连接数据库*/
- define('CLIENT_MULTI_RESULTS', 131072);
- ?>
- <?
- /*定义变量*/
- $dispid="";
- $disp="";
- $starttime=time()+microtime();
- $loop=100;
- ?>
- <?
- for(;$loop>=0;$loop--) {
- $conn = mysql_connect("127.0.0.1", "upguard", "testtest",1,CLIENT_MULTI_RESULTS) or die("Could not connect: ".mysql_error());
- mysql_select_db("testdb") or die ("Cannot select database!");
- $result=mysql_query("select * from randtest order by rand() limit 10;") or die("Query failed:" .mysql_error());
- while($row = mysql_fetch_array($result, MYSQL_ASSOC))
- {
- $dispid.=$row["ID"].",";
- $disp.=$row["randed"].",";
- }
- $dispid.="<br/>\n";
- $disp.="<br/>\n";
- mysql_free_result($result);
- mysql_close($conn);
- }
-
- echo "<br/><br/><font color=red>".strval(time()+microtime()-$starttime)."s</font><br/><br/>";
- echo $dispid."<br/><br/>".$disp;
- ?>
- <?
- /*关闭数据连接*/
- ?>
复制代码
非常郁闷…使用存储过程的反而用时更多?到底是什么原因?是不是因为查询语句较简单?无法体现出存储过程的优越性?一大堆疑问,希望各位能够帮我解答,谢谢。 |
|