关于 withCount

withCount能指定count(id)这个字段吗,count(*)太影响性能了

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 10

->select(DB::raw('count(id)'))加上这个也不行的

4年前 评论

为什么说 count(*) 影响性能?

4年前 评论
Epona 4年前
Epona

查看了下源码,是不可以的,代码中直接写死了count(*)

//Illuminate\Database\Eloquent\Relations\Relation
    public function getRelationExistenceCountQuery(Builder $query, Builder $parentQuery)
    {
        return $this->getRelationExistenceQuery(
            $query, $parentQuery, new Expression('count(*)')
        )->setBindings([], 'select');
    }
4年前 评论
charming-xiaoxia (楼主) 4年前

可以看看官方文档 https://dev.mysql.com/doc/refman/8.0/en/gr...

InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.

For MyISAM tables, COUNT(*) is optimized to return very quickly if the SELECT retrieves from one table, no other columns are retrieved, and there is no WHERE clause.

对于 InnoDB 来说,COUNT(*)COUNT(1) 是完全一致的,并没有什么不同

对于 MyISAM 来说,如果没有带上 WHERE 语句,则会非常快的返回结果,比如:

mysql> SELECT COUNT(*) FROM student;

这种优化也仅仅适用于 MyISAM,因为这种存储引擎存储了精确的行数。

个人经验而言,我认为是没有什么差别的

count(*), count(1), count(id)

4年前 评论
charming-xiaoxia (楼主) 4年前

简单的count(*)应该不会花这么多时间吧 ,可能你的是InnoDB 因为stackoverflow上有人是这么说的 COUNT() with InnoDB is slower than COUNT(ID) because InnoDB doesn’t cache the row count. :joy:我没验证过就是了。我在MyISAM下测试的结果:加上where,count() ,count(1)和count(索引字段) 是一样的速度,where条件有索引也比没索引快,count(id)跟其他没索引的字段一样慢,count一个空字段就更慢了。所以我想还是 count( *),再给where字段加合适的索引
file

file

file

4年前 评论
CrazyZard

file

file
别再说什么百万innodb表count(*)数据查询慢了 4千万的数据量也就是几十秒的概念

4年前 评论
FMW 4年前
CrazyZard (作者) 4年前
FMW 4年前

@charming-xiaoxia  explain 下。感觉你这个肯定有问题。

4年前 评论

同感,我10万条的一个测试表,有个字段是json,大概50kB一个json,count(*)要十多秒。。。后来删掉这个json字段分其他表存储之后,count(*)只需要最多30毫秒,芜湖起飞!
(count(*)的SQL执行倒是不慢,但是模型加载会很慢)

3年前 评论
charming-xiaoxia (楼主) 3年前
Q1ao (作者) 3年前
charming-xiaoxia (楼主) 3年前
charming-xiaoxia (楼主) 3年前
66

没区别呀 他们命中的 rows 都是相同数量

select count(*)

select count(id)

file

file
实查效率也没有区别200W的表

Laravel

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!