2024-09-04 10:34:15 461次浏览 2条回答 0 悬赏 10 金钱
/**
 * @description 关联人员模型
 * @return ActiveQuery
 */
public function getInternationalPerson(): ActiveQuery
{
    return $this->hasOne(Person::className(), ['id' => 'international_examine_person_id']);
}

/**
 * @description 获取用户模型的用户真实名称
 * @return string
 */
public function getInternational_examine_person_name(): string
{
    return $this->internationalPerson ? $this->internationalPerson->name : '';
}

yii debugger 查看大量无异议的 SELECT * FROM traq_person WHERE 0=1 查询

补充于 2024-09-04 10:34

企业微信截图_17254171642931.png

  • 回答于 2024-09-04 10:43 举报

    MySQL 查询器会优化

  • 回答于 2024-09-14 22:35 举报

    Yii2框架中的Active Record(AR)模式是一种面向对象的方式,用于操作数据库记录。在使用Active Record时,合理的查询优化可以显著提高应用的性能。

    1. 避免不必要的查询

    避免冗余查询

    确保在进行查询时,已经检查是否有必要的数据存在。例如,如果一个属性已经在一次查询中被加载,就不要再进行第二次查询来获取相同的数据。

    $user = User::findOne(1);
    echo $user->name; // 第一次查询
    
    // 如果没有其他操作,再次查询是不必要的
    echo $user->name; // 再次查询
    

    使用延迟加载(Lazy Loading)

    Yii2的Active Record默认使用延迟加载,即只有在真正访问关联数据时才会发起查询。合理使用延迟加载可以避免不必要的查询。

    $user = User::findOne(1);
    // 下面这一行会触发查询
    echo $user->profile->bio;
    

    使用急加载(Eager Loading)

    如果你知道某个关联数据一定会被使用,可以使用急加载来一次性加载所有需要的数据,而不是在每次访问关联数据时都发起查询。

    $user = User::findOne(1)->with('profile')->one();
    // 下面这一行不会触发新的查询
    echo $user->profile->bio;
    

    2. 批量操作

    批量插入

    如果需要插入大量的数据,可以使用批量插入而不是逐条插入。

    $data = [
        ['name' => 'Alice', 'age' => 30],
        ['name' => 'Bob', 'age' => 25],
        // 更多数据...
    ];
    
    Yii::$app->db->createCommand()->batchInsert(
        'users', // 表名
        ['name', 'age'], // 列名
        $data // 数据
    )->execute();
    

    批量更新

    类似地,批量更新也可以提高性能。

    $idsToUpdate = [1, 2, 3, 4, 5];
    $data = [
        ['id' => 1, 'status' => 'active'],
        ['id' => 2, 'status' => 'inactive'],
        // 更多数据...
    ];
    
    Yii::$app->db->createCommand()->batchUpdate(
        'users', // 表名
        ['status'], // 更新的列名
        $data // 数据
    )->where(['id' => $idsToUpdate])->execute();
    

    3. 使用查询构建器

    有时候,直接使用查询构建器(Query Builder)而不是Active Record可以更好地控制查询细节,从而优化性能。

    $query = Yii::$app->db->createCommand('SELECT * FROM users WHERE age > 30');
    $users = $query->queryAll();
    

    4. 使用SQL缓存

    如果某些查询结果在短时间内不会改变,可以考虑使用SQL缓存来减少数据库的查询次数。

    $query = (new \yii\db\Query())
        ->select('*')
        ->from('users')
        ->where(['status' => 'active'])
        ->cache(60); // 缓存60秒
    $users = $query->all();
    

    5. 使用查询缓存

    除了SQL缓存外,还可以使用查询结果的缓存,但这需要谨慎使用,确保数据的一致性。

    $query = User::find()->where(['status' => 'active'])->cache(60); // 缓存60秒
    $users = $query->all();
    

    6. 使用事务

    在进行一系列数据库操作时,使用事务可以确保操作的原子性,并减少无效的查询。

    $db = Yii::$app->db;
    $db->beginTransaction(); // 开始事务
    
    try {
        $db->createCommand('INSERT INTO users (name, age) VALUES ("Alice", 30)')->execute();
        $db->createCommand('UPDATE profiles SET bio="New bio" WHERE user_id=1')->execute();
        
        $db->transaction->commit(); // 提交事务
    } catch (\Exception $e) {
        $db->transaction->rollBack(); // 回滚事务
    }
    

    7. 使用索引

    合理使用索引可以加快查询速度。确保经常用于查询的列上有合适的索引。

    CREATE INDEX idx_users_status ON users(status);
    

    8. 分页查询

    如果查询结果集很大,可以使用分页来减少一次性加载的数据量。

    $users = User::find()
        ->orderBy('created_at DESC')
        ->offset(($page - 1) * $pageSize)
        ->limit($pageSize)
        ->all();
    

    总结

    通过以上方法,你可以优化Yii2中的Active Record查询,减少无意义的查询次数,提高应用性能。合理使用延迟加载、急加载、批量操作、查询构建器、缓存、事务以及索引等技术,可以显著提升查询效率。

您需要登录后才可以回答。登录 | 立即注册
zhang5207892
助理

zhang5207892

注册时间:2017-09-13
最后登录:2024-09-26
在线时长:13小时14分
  • 粉丝0
  • 金钱10
  • 威望0
  • 积分140

热门问题