平时yii中开启了debug tools经常会有这样的查询:

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()
......

查询速度挺快也没啥问题,但是往往你的宝塔面板中mysql里的“当前状态”会这样显示:

01.png

02.gif

PS:没用使用宝塔面板可以使用mysql查询:SHOW GLOBAL STATUS;查看Select_full_join字段的值就是。

因为schema查询是全表扫描的,所以没用使用索引的量这个值会高,好在查询速度是很快的,不管他都没事。

但是不管就不会有这篇文章了,万一真的我们没做索引呢也会统计在这儿数字太大了会影响我们的判断。简单说,我们要缓存schema查询就能减少这个数字了。

打开我们的数据库配置文件,高级模板默认是common/config/main-local.php在db里添加以下配置:

return [
    'components' => [
        'db' => [
            ......//省略原有配置
            
            // 开启schema缓存
            'enableSchemaCache' => true, 

	    // 缓存有效时间。默认3600秒
	    'schemaCacheDuration' => 86400,
	    
	    // 不缓存的表
	    'schemaCacheExclude' => [],

	    // 用来存储 schema 信息的缓存组件名称
	    'schemaCache' => 'cache',
        ],
        ......//省略下方配置
    ],
];

然后就可以缓存一天了。强烈建议生产模式开启schema缓存。

完!