Yii2 MySQL如何防止重复select查询

Yii2 MySQL how to prevent duplicate select query

我在调试菜单中看到我有一些重复的 select 查询。特别是,这是我在 4 个不同文件中得到 4 次 SELECT * FROM page_adminlang WHERE (language=bg) AND (page_id=1) 的那个。有没有正确的方法来防止这种情况,这对网站速度性能有很大的影响吗?我应该在 $page = PageAdmin::findOne(1) 之类的变量中检索该行,然后在我需要的地方调用它吗?这是正确的方法吗?我红色其他文章,但它们主要用于插入时的重复行。不熟悉 MySQL 性能调优,但想深入了解这个 area.Thank 你提前!

我通常不会遇到这个问题,但如果我必须多次从数据库中检索某些内容(而且我知道这不会改变),我会在我的模型中做类似的事情

private $_myData = null;
public function getMyData() {
    if ($this->_myData !== null) return $this->_myData;

    $this->_myData = //query your data;
    return $this->getMyData();
}

选项 1 - 配置 MemCache 组件

一个更简单的方法是启用数据库缓存,然后没关系,先设置5秒的持续时间。

在您的组件数据库连接设置中设置以下属性:

'components' => [
    'db' => [
        'class' => 'yii\db\Connection',
        'dsn' => 'mysql:host=localhost;dbname=dbname',
        'username' => 'root',
        'password' => 'password',
        'charset' => 'utf8',
        ....
        'enableQueryCache' => true,
        'queryCacheDuration' => 5, // five seconds
        ....
    ]
]

参见:

  1. https://www.yiiframework.com/doc/guide/2.0/en/caching-data
  2. https://www2.0/yii-db.yiiframework.com/doc/api/-connection

选项 2 - 带缓存的自定义查询

public function getResults()
{
    // Cache expires every x seconds (60sec/min * 60min/hr * 6hrs)
    $duration = 60*60*6; 
    $sql_query = "SELECT * FROM some_table";
    
    return Yii::$app->db->createCommand($sql_query)->cache($duration)->queryAll();
}