Yii2 Active Record 怎么优化无意义查询次数? [ 2.0 版本 ]
/**
* @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
查询
共 3 个回答
-
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
最后登录:2024-09-26
在线时长:13小时14分
- 粉丝0
- 金钱10
- 威望0
- 积分140