我正在做一个Laravel5.2项目,我正在使用雄辩的模型,但我不知道如何处理聚合特性。
假设我有产品和价格模型,以及一个hasMany关系,所以一个产品可以有多个价格。
现在,在我的产品模型中,我想要一个函数,它可以给出产品的平均价格。
我找到了两种获得相同结果的方法:
( 1.)雄辩聚合
public function avg_price()
{
return $this->prices()->avg('price');
}( 2.)MySql聚合
public function avg_price()
{
return $this->prices()->groupBy('product_id')->first([\DB::raw('AVG(price) AS avg_price')])->avg_price;
}因此,它们都显示了正确的结果,但是,我想知道哪一个更适合使用性能方面的方法。
据我所知,雄辩的聚合将从所有结果(价格)中收集一个集合,然后在其上计算平均值,而MySQL聚合将简单地在MySQL中执行AVG函数并作为结果返回一个行。
我想听听别人的意见。提前谢谢。
发布于 2016-12-02 00:07:10
我不能对这两种选择进退两难。我在这个案子里做了个小实验。表平均值只有一列“值”。表中还记录了2052195个随机整数。
$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);
}结果
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)
}https://stackoverflow.com/questions/40852763
复制相似问题