2014-02-09 30 views
0

我創建了一個類似於gmail收件箱的視圖,其中收件箱可從左側點擊,然後頂部有選項卡,如促銷,論壇等。當用戶點擊每個標籤時,顯示屬於該選項卡的內容,例如 - 激發論壇和MySQL查詢。帶有多個計數的Tab Navbar

單個視圖在項目外觀和感覺上可能沒有什麼區別,但導航相似。

因此,單擊每個選項卡時會觸發單個SQL查詢,但現在我還必須始終顯示每個選項卡的總項目數,並在點擊任何其他選項卡/左主圖標時保持更新以及。

So, I am ending up firing SQL queries for all tabs and keep their counts all the time which is very database intensive. 

另一個極端是保持所有這些罪名在MySQL表和遞增/遞減它,我需要改變現有的所有功能,所有的時間。請爲此類導航提供其他方式。

PHP Yii framework 1.1。*和MySQL 5.6。

回答

1

您加載和計算每個選項卡的項目的方式可能會影響MySQL負載和頁面速度。 CActiveRecord::count()CActiveRecord::findAll()之間的簡單的基準可以在這裏看到:

$modelCount = Model::model()->count(); 

$modelCount = count(Model::model()->findAll()); 

// DB profile log: 
// system.db.CDbCommand.query(SELECT COUNT(*) FROM `throw` `t`)  1 0.00029s  
// system.db.CDbCommand.query(SELECT * FROM `throw` `t`) 1 0.00283s 

的的CActiveRecord ::計數()是快十倍,你計數的FindAll()與PHP計數()甚至前。當然,對於您實際使用的選項卡,您可以使用相同的findAll()查詢來計算選項卡編號,並填充該頁面上的項目列表。

要爲自己和實驗SQL查詢速度測試,添加查詢分析以下內容添加到您的config.php文件:

'db'=>array(
    // ... existing db config etc 
    'enableProfiling' => true, 
    'enableParamLogging' => true, 
), 

並在日誌配置...

'log'=>array(
    'class'=>'CLogRouter', 
    'routes'=>array(
     array(
      'class' => 'CProfileLogRoute', 
      'levels' => 'profile', 
      'enabled' => true, 
     ), 

優化你的計數查詢可能足以提高你的頁面速度和MySQL負載,以滿足你或你的用戶的需求。

或者你可以保持標籤計數會話陣列:

Yii::app()->session['tabCounts'] = array(
    'tab1' => 44, 
    'tab2' => 456, 
    'tab3' => 9345, 
); 

然後在任何控制器的行動,將導致改變項目的數量,增加一個鉤來改變數量。當然,你仍然需要在首次加載時使初始MySQL查詢填充數組。