为什么findAll 比find快?

#1 ssmh01

          $t1 = microtime(true);  
          $userCon = spClass("MUser")->find(array('subscribe_time'=>'1395407051'));
          $t2 = microtime(true);   
          echo (($t2-$t1)*1000)."\n";
      (ps:运行时间:18.4319019318)




          $t1 = microtime(true);  
          $userCon = spClass("MUser")->findAll(array('subscribe_time'=>'1395407051'),null,null,'1');
          $t2 = microtime(true);   
          echo (($t2-$t1)*1000)."\n";
           (ps:运行时间:7.91501998901)


“可以说findAll的limit等于1就是find” 这个是文档里面写的。


但是实际操作发现findAll设置LIMIT为1 后运行速度比find快了一倍多?这是什么情况。。

2014-06-05 11:32:10

#2 jake

看看源码,find比findAll多执行了一个array_pop函数,所以你这个机器上多了0.01秒。
另外,一般这样测试也不太准确,因为你会发现时间是每次执行都不一样的,这个和机器的性能有关,建议的性能测试是分别跑1000次以上取平均值。

2014-06-05 13:56:22

#3 ssmh01

哦。。知道了。。上面的数值是我跑了300次取的平均值。。。今天研究sql速度。。发觉设置了sort貌似速度快很多。
还有就是我的是聊天机器人的数据库,里面词库数据量超过了五千万了,每天读取的次数大概80万左右。。这种数据量大的话该怎么优化?

2014-06-05 15:21:38

#4 ssmh01

已经分表储存了。。还有什么方法能优化?

2014-06-05 15:35:49

#5 jake

sort会快? sort对应是order by,理论上来说order by速度会比较慢的。

数据量大,并且估计你的读取量比较大,那么看起来写入的就很少了。这样优化的建议是:

1. 做好索引,尽可能让索引生效,explain一下输出的SQL

2. 做数据缓存,比如说spCache,spAccess之类的,5000w数据每天读80w次那么读取命中还是挺高的。

2014-06-05 15:39:23