首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >雄辩的ORM聚合与MySql聚合

问雄辩的ORM聚合与MySql聚合
EN

Stack Overflow用户
提问于 2016-11-28 20:19:56
回答 1查看 1.4K关注 0票数 1

我正在做一个Laravel5.2项目,我正在使用雄辩的模型,但我不知道如何处理聚合特性。

假设我有产品和价格模型,以及一个hasMany关系,所以一个产品可以有多个价格。

现在,在我的产品模型中,我想要一个函数,它可以给出产品的平均价格。

我找到了两种获得相同结果的方法:

( 1.)雄辩聚合

代码语言:javascript
复制
public function avg_price()
{
     return $this->prices()->avg('price');
}

( 2.)MySql聚合

代码语言:javascript
复制
public function avg_price()
{    
    return $this->prices()->groupBy('product_id')->first([\DB::raw('AVG(price) AS avg_price')])->avg_price;
}

因此,它们都显示了正确的结果,但是,我想知道哪一个更适合使用性能方面的方法。

据我所知,雄辩的聚合将从所有结果(价格)中收集一个集合,然后在其上计算平均值,而MySQL聚合将简单地在MySQL中执行AVG函数并作为结果返回一个行。

我想听听别人的意见。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-02 00:07:10

我不能对这两种选择进退两难。我在这个案子里做了个小实验。表平均值只有一列“值”。表中还记录了2052195个随机整数。

代码语言:javascript
复制
$adapter = new mysqli('localhost','korisnik','lozinka','test');
$results = [];

for($i = 1; $i <= 10; $i++){
    $start = microtime(true);
    $res = $adapter->query("select avg(value) as avg from averager");
    $res = $res->fetch_object();
    $results['mysql'] = microtime(true)-$start;

    $start = microtime(true);
    $res = $adapter->query("select * from averager");
    $avg = false;
    while($resItem = $res->fetch_object())
        $avg = $avg ? ($avg+$resItem->value)*0.5 : $resItem->value;

    $results['php'] = microtime(true)-$start;

    echo "Test number {$i}\r\n";
    var_dump($results);
}

结果

代码语言:javascript
复制
Test number 1
array(2) {
  'mysql' =>
  double(3.6330089569092)
  'php' =>
  double(15.645164012909)
}
Test number 2
array(2) {
  'mysql' =>
  double(4.0829129219055)
  'php' =>
  double(16.118007183075)
}
Test number 3
array(2) {
  'mysql' =>
  double(3.5810949802399)
  'php' =>
  double(14.581390857697)
}
Test number 4
array(2) {
  'mysql' =>
  double(4.1148250102997)
  'php' =>
  double(15.509108066559)
}
Test number 5
array(2) {
  'mysql' =>
  double(3.9069290161133)
  'php' =>
  double(14.851855993271)
}
Test number 6
array(2) {
  'mysql' =>
  double(3.4348700046539)
  'php' =>
  double(14.505731105804)
}
Test number 7
array(2) {
  'mysql' =>
  double(3.589262008667)
  'php' =>
  double(14.98966383934)
}
Test number 8
array(2) {
  'mysql' =>
  double(3.6161508560181)
  'php' =>
  double(15.630507946014)
}
Test number 9
array(2) {
  'mysql' =>
  double(4.4143221378326)
  'php' =>
  double(15.816854000092)
}
Test number 10
array(2) {
  'mysql' =>
  double(4.1319460868835)
  'php' =>
  double(15.999732017517)
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40852763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档