Yii2 开启 Schema 缓存,提高性能。

10-16 11:30 字数 1451 阅读 144

通过Yii2 debug toolbar 发现有大量这种查询

SELECT
    kcu.constraint_name,
    kcu.column_name,
    kcu.referenced_table_name,
    kcu.referenced_column_name
FROM information_schema.referential_constraints AS rc
JOIN information_schema.key_column_usage AS kcu ON
    (
        kcu.constraint_catalog = rc.constraint_catalog OR
        (kcu.constraint_catalog IS NULL AND rc.constraint_catalog IS NULL)
    ) AND
    kcu.constraint_schema = rc.constraint_schema AND
    kcu.constraint_name = rc.constraint_name
WHERE rc.constraint_schema = database() AND kcu.table_schema = database()
AND rc.table_name = 'my_user' AND kcu.table_name = 'my_user'

这个在查询数据库的 schema 信息,但是对于线上的产品,这样的查询是没有意义的,所以可以打开 Schema 缓存来避免多余的性能开销。

'db' => [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=mydatabase',
    'username' => 'root',
    'password' => '',
    'enableSchemaCache' => true, // 开启schema缓存

    // Duration of schema cache.
    'schemaCacheDuration' => 3600, // 缓存有效时间

    // Name of the cache component used to store schema information
    // 用来存储 schema 信息的缓存组件名称
    'schemaCache' => 'cache',
],

提示

1、如果查询数据的时候使用了 asArray() 方法返回数组,是用不到 schema 缓存的。

2、如果修改了数据表的结构,比如增删字段,需要删除 schema 缓存才能生效,不然会报错。

// 方法一: 清空表结构缓存的方法

// 刷新 schema cache
Yii::$app->db->schema->refresh();

// 清楚指定表的 schema cache
Yii::$app->db->schema->refreshTableSchema($tableName);


// 方法二: 清空所有的缓存--不仅仅是 mysql 表结构
Yii::$app->cache->flush();


// 方法三: 使用 yii 命令行的方式 commond 清除缓存
cache/flush                Flushes given cache components.
cache/flush-all            Flushes all caches registered in the system.
cache/flush-schema         Clears DB schema cache for a given connection component.
cache/index (default)      Lists the caches that can be flushed.

// 执行 
./yii cache/flush-all
0人点赞>
关注 收藏 改进 举报
2 条评论
排序方式 时间 投票
kittyfamous

开启了 有的时候gii可能会发生运行时错误,使用gii的时候,关闭先Schema缓存。

Up骚年
可以,学到了。
请登录后发表评论