Yii schemaCache 配置踩坑

01-20 17:00 字数 2646 阅读 451 已编辑

我们都知道如果不配置 enableSchemaCache => true,那么Yii每次操作数据库都会有一堆类似这样的SQL。

SELECT
    `kcu`.`CONSTRAINT_NAME` AS `constraint_name`,
    `kcu`.`COLUMN_NAME` AS `column_name`,
    `kcu`.`REFERENCED_TABLE_NAME` AS `referenced_table_name`,
    `kcu`.`REFERENCED_COLUMN_NAME` AS `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` = 'users_data' AND `kcu`.`TA

每次更新数据都会有这么长一条SQL会被执行,而线上运行的项目,表结构也不会经常改变,所以这种每次这种查询有点太浪费性能了,徒增IO,所以一般线上稳定运行的项目,我们会开启 schemaCache

'db' => [
        'class' => 'yii\db\Connection',
        'dsn' => 'mysql:host=127.0.0.1;dbname=testdb',
        'username' => 'root',
        'password' => '1234567',
        'charset' => 'utf8mb4',
        'enableSchemaCache' => true,
        'schemaCacheDuration' => 3600, // Duration of schema cache.
        'schemaCache' => 'redis', // Name of the cache component used to store schema information
]

schemaCache有关的主要是三个参数

  • enableSchemaCache 是否开启schema缓存
  • schemaCacheDuration schema缓存的时间,单位s
  • schemaCache 存储schema信息的缓存组件的名称

主要是 schemaCache这个配置,如果你不配置,Yii会找 cache组件,默认情况下是cache组件是这样的。

'components' => [
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
]

可以看到默认是通过文件缓存的方式缓存schema信息,但是我手懂配置了 'schemaCache' => 'redis',所以Yii框架去找我的 redis 组件是去缓存schema信息,我的redis组件是什么样的呢。

'components' => [
     'redis' => [
            'class' => 'yii\redis\Connection',
            'hostname' => '127.0.0.1',
            'port' => 6379,
            'password' => '1234567',
            'database' => 0,
        ],   
]

可以看到我的redis组件只是一个redis的连接,classyii\redis\Connection,然后我以为一切都万事大吉了,直到今天我查看runtime的log,我发现每次更新数据的时候还是会查询information_schema表,每次还是会有开头的长SQL被执行,为什么我的schemaCache没有生效呢???

然后我看了一下如果我不配置'schemaCache' => 'redis',他会找cache组件,而cache组件是一个yii\caching\FileCache,它实现了 yii\caching\CacheInterface 接口,而 yii\caching\CacheInterface接口定义了一系列增删改查的方法。

所以 schemaCache组件必须实现 yii\caching\FileCache 接口,Yii才能用的schemaCache组件缓存schema信息。

'components' => [
    'cache' => [
            // 'class' => 'yii\caching\FileCache',
            'class' => 'yii\redis\Cache',
            'keyPrefix' => 'yiicache_',
        ], 
]

相关阅读

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

4人点赞>
关注 收藏 改进 举报
2 条评论
排序方式 时间 投票
kittyfamous

学习了,感觉论坛有些冷清啊,就几个人。

Up骚年
是的,顺其自然吧。
请登录后发表评论