2018-12-16 21:50:14 2699次浏览 2条回答 0 悬赏 63 金钱

关于AR::findOne()AR::find()->where()->one()AR::find()->where()->limit(1)->one()的查询速度问题!

  1. 如果是主键查询,以下哪一个查询速度更快?

    AR::findOne(5);
    AR::find()->where(['id'=>5])->one();
    AR::find()->where(['id'=>5])->limit(1)->one();
    
  2. 如果是普通查询,以下哪一个查询速度更快?

    AR::findOne(['name' => '张三']);
    AR::find()->where(['name' => '张三'])->one();
    AR::find()->where(['name' => '张三'])->limit(1)->one();
    

最佳答案

  • 花椒 发布于 2018-12-17 09:58 举报

    1、如果是主键,他们的速度是一样的,因为sql是一样的,虽然最后一个有limit但是因为只有一条记录所以没啥影响
    2、如果是普通查询,

    AR::findOne(['name' => '张三']);
    AR::find()->where(['name' => '张三'])->one();
    

    这两个sql应该都是要去获取匹配到的记录,然后再取其中一条,速度应该一样的。

    AR::find()->where(['name' => '张三'])->limit(1)->one();
    

    最后这个因为限定了只取匹配到的一条,理论上是比上面的2条快

    1 条回复
    回复于 2018-12-17 11:09 回复

    总结下来,就是:

    1. 如果是主键查询,哪个都一样,推荐AR::findOne()
    2. 如果是条件查询,使用AR::find()->where(['name' => '张三'])->limit(1)->one()会快一些,因为sql返回的只有一条记录
  • 回答于 2018-12-17 10:10 举报

    看看源码吧,稍微试试就能感觉其实没啥明显速度上的区别。
    AR的findOne()其实还是走的【查询构造器】而已

    protected static function findByCondition($condition)
        {
            $query = static::find();
    
            if (!ArrayHelper::isAssociative($condition)) {
                // query by primary key
                $primaryKey = static::primaryKey();
                if (isset($primaryKey[0])) {
                    // if condition is scalar, search for a single primary key, if it is array, search for multiple primary key values
                    $condition = [$primaryKey[0] => is_array($condition) ? array_values($condition) : $condition];
                } else {
                    throw new InvalidConfigException('"' . get_called_class() . '" must have a primary key.');
                }
            }
    
            return $query->andWhere($condition);
        }
    

    但是用法其实不一样:

    findOne是查找AR模型对象的一维的find()是AR实现查询构造器的快捷方式而已one是一条记录一维的all是所有记录二维的column是一列多行
        scalar()是单行单列的一个标量
您需要登录后才可以回答。登录 | 立即注册
墨轩娣
董事长

墨轩娣 无锡

注册时间:2015-03-25
最后登录:17小时前
在线时长:275小时1分
  • 粉丝38
  • 金钱59785
  • 威望150
  • 积分64035

热门问题