今天在進行對Yii程序sql語句優化時發現了一個問題,在所有sql執行之前都會先執行一條sql語句如圖:
SHOW
FULL COLUMNS
FROM `pc07_user_0`,這條語句是什麼呢 首先我們先執行一下:
可以看出 這條sql語句是獲取表的信息,包括字段信息,備註,主鍵等。爲什麼Yii 執行slq語句前都要獲取表信息呢? 因爲AR模式,將表映射到一個對象,表字段做爲對象的屬性。就是因爲這點,當你對多張表進行操作是 就會有多條SHOWFULLCOLUMNSFROM語句,而且這條語句耗時最大,圖一:耗時290毫秒,一個請求290毫秒,10個2.9秒,100個......想想都可怕。
解決方法:
在main.php 文件中的 db配置中加入 一個配置項:
'db'=>array(
'connectionString' => 'mysql:host=127.0.0.1;dbname=passport_sibu_cn;port=3306',
'emulatePrepare' => true,
'enableProfiling'=>true,
//先從緩存中取數據表結構信息 有效時間爲1小時
'schemaCachingDuration'=>3600,
'enableParamLogging'=>true,
'username' => 'root',
'password' => 'root',
'charset' => 'utf8',
'tablePrefix' => 'pc07_',
),
接下來要開啓緩存,在main.php文件中添加cache組件: 'cache'=>array(
'class' => 'CFileCache',
),
效果: