[心得]全域公告(Global announcement)提升執行效能

phpBB 2 MOD Support
無論是官方或非官方認證之外掛,安裝與使用問題討論。
(發表文章請按照公告格式發表,違者砍文)

版主: 版主管理群

主題已鎖定
ETERNAL
星球公民
星球公民
文章: 297
註冊時間: 2002-01-23 11:23

[心得]全域公告(Global announcement)提升執行效能

文章 ETERNAL »

在安裝Global announcement外掛時

其中有一段\r
在viewforum.php裡面\r
會加入\r

代碼: 選擇全部

// 
// All GLOBAL announcement data, this keeps GLOBAL announcements 
// on each viewforum page ... 
// 
$sql = "SELECT t.*, u.username, u.user_id, u2.username as user2, u2.user_id as id2, p.post_time, p.post_username 
	FROM " . TOPICS_TABLE . " t, " . USERS_TABLE . " u, " . POSTS_TABLE . " p, " . USERS_TABLE . " u2 
	WHERE t.topic_poster = u.user_id 
	AND p.post_id = t.topic_last_post_id 
	AND p.poster_id = u2.user_id 
	AND t.topic_type = " . POST_GLOBAL_ANNOUNCE . " 
	ORDER BY t.topic_last_post_id DESC "; 
if( !$result = $db->sql_query($sql) ) 
{
	message_die(GENERAL_ERROR, "Couldn't obtain topic information", "", __LINE__, __FILE__, $sql); 
}

$topic_rowset = array(); 
$total_announcements = 0; 
while( $row = $db->sql_fetchrow($result) ) 
{
	$topic_rowset[] = $row; 
	$total_announcements++; 
}

$db->sql_freeresult($result); 
// End add - Global announcement MOD
其實這一段與下面的SQL敘述重複了

代碼: 選擇全部

//
// All announcement data, this keeps announcements
// on each viewforum page ...
//
$sql = "SELECT t.*, u.username, u.user_id, u2.username as user2, u2.user_id as id2, p.post_time, p.post_username
	FROM " . TOPICS_TABLE . " t, " . USERS_TABLE . " u, " . POSTS_TABLE . " p, " . USERS_TABLE . " u2
	WHERE t.forum_id = $forum_id 
		AND t.topic_poster = u.user_id
		AND p.post_id = t.topic_last_post_id
		AND p.poster_id = u2.user_id
		AND t.topic_type = " . POST_ANNOUNCE . " 
	ORDER BY t.topic_last_post_id DESC ";
差別只在t.topic_type判斷條件不同

所以只要把第一段拿掉
第二段敘述中的

代碼: 選擇全部

t.forum_id = $forum_id 
改成

代碼: 選擇全部

((t.forum_id = $forum_id AND t.topic_type = " . POST_ANNOUNCE . " ) or t.topic_type = " . POST_GLOBAL_ANNOUNCE . " )
然後把ORDER BY 前面的

代碼: 選擇全部

AND t.topic_type = " . POST_ANNOUNCE . " 
刪除掉

代碼: 選擇全部

ORDER BY t.topic_last_post_id DESC ";
改成

代碼: 選擇全部

	ORDER BY t.topic_type DESC,t.topic_last_post_id DESC ";
做完以上步驟可以提升viewforum.php的執行效能\r

以上是我裝Global announcement的心得
若你論壇的資料不多感覺沒什麼差別,這篇文章看看就好 :mrgreen:
最後由 ETERNAL 於 2005-09-23 22:49 編輯,總共編輯了 1 次。
flyinghail
星球公民
星球公民
文章: 48
註冊時間: 2004-02-10 02:37

文章 flyinghail »

我的感覺是這種修改未必就好,雖然確實減少了一次查詢,不過我記得MySQL在WHERE中OR是不會使用索引的,沒有索引的話在主題很多的時候可能會檢索很慢,不知道有沒有用EXPLAIN檢查看看是否應用了索引

這種方法還有可能造成Global Announcement排在Announcement的後面...還得修改一下ORDER BY
ETERNAL
星球公民
星球公民
文章: 297
註冊時間: 2002-01-23 11:23

文章 ETERNAL »

flyinghail 寫:我的感覺是這種修改未必就好,雖然確實減少了一次查詢,不過我記得MySQL在WHERE中OR是不會使用索引的,沒有索引的話在主題很多的時候可能會檢索很慢,不知道有沒有用EXPLAIN檢查看看是否應用了索引

這種方法還有可能造成Global Announcement排在Announcement的後面...還得修改一下ORDER BY
order我漏寫了,謝謝提醒
現在補上

代碼: 選擇全部

ORDER BY t.topic_last_post_id DESC ";
改成

代碼: 選擇全部

	ORDER BY t.topic_type DESC,t.topic_last_post_id DESC ";
至於OR有沒有用到索引,這就等其他高手來求證囉,我也不清楚
我是第一次聽到MySQL的OR不會用到索引,MySQL有這麼差嗎 :?:
ETERNAL
星球公民
星球公民
文章: 297
註冊時間: 2002-01-23 11:23

文章 ETERNAL »

剛剛測試結果

有MySQL的OR有使用索引
測試結果如下圖所示\r
圖檔
flyinghail
星球公民
星球公民
文章: 48
註冊時間: 2004-02-10 02:37

文章 flyinghail »

的確是使用了索引,看來是我看文檔的時候理解錯了^^a
第一行的type為range,相對于原來類型的ref是要差一些...還算是可以接受
速度嘛...測試了下感覺變化不大...使用的是貼子超過二百萬的數據庫\r
不過說實話...如果裝了attachement mod和cash mod主要頁面的運行時間都用在php上了,MySQL佔的比例要小得多
依夢兒
竹貓忠實會員
竹貓忠實會員
文章: 2013
註冊時間: 2002-11-20 00:07

文章 依夢兒 »

Queries 數有變少了一些,修改前 Queries 數為 24 ,修改後 Queries 數降為 20 。^^
有任何關於 phpBB 或是架站的問題,請在論壇上公開發表出來,大家一起討論。
請不要丟私人訊息問我,因為私訊是用來聊私事的。
這樣作對於解決您的問題一點幫助也沒有,也很沒有效率,小弟我一概謝絕。



搜尋是一種美德,在發問之前,請多加利用頂端的文章搜尋功能,搜尋可能的關鍵字。
確定您想問的問題找不到答案後,再發問。
flyinghail
星球公民
星球公民
文章: 48
註冊時間: 2004-02-10 02:37

文章 flyinghail »

依夢兒 寫:Queries 數有變少了一些,修改前 Queries 數為 24 ,修改後 Queries 數降為 20 。^^
- -b不會減少那麽多啦...應該只減少一次才對,還有三次是更新seesion的,如果有一段時間沒有刷新頁面就會多出來
ETERNAL
星球公民
星球公民
文章: 297
註冊時間: 2002-01-23 11:23

文章 ETERNAL »

flyinghail 寫:的確是使用了索引,看來是我看文檔的時候理解錯了^^a
第一行的type為range,相對于原來類型的ref是要差一些...還算是可以接受
速度嘛...測試了下感覺變化不大...使用的是貼子超過二百萬的數據庫\r
不過說實話...如果裝了attachement mod和cash mod主要頁面的運行時間都用在php上了,MySQL佔的比例要小得多
除了數據庫數量外,有把同時上線的人數也放入測試條件內嗎?

人數越多,壓力會越大
flyinghail
星球公民
星球公民
文章: 48
註冊時間: 2004-02-10 02:37

文章 flyinghail »

ETERNAL 寫:
flyinghail 寫:的確是使用了索引,看來是我看文檔的時候理解錯了^^a
第一行的type為range,相對于原來類型的ref是要差一些...還算是可以接受
速度嘛...測試了下感覺變化不大...使用的是貼子超過二百萬的數據庫\r
不過說實話...如果裝了attachement mod和cash mod主要頁面的運行時間都用在php上了,MySQL佔的比例要小得多
除了數據庫數量外,有把同時上線的人數也放入測試條件內嗎?

人數越多,壓力會越大
5分鐘大概100人左右 :roll:
估計就算減少0.00*s實際輸出的時候也誤差掉了...
ETERNAL
星球公民
星球公民
文章: 297
註冊時間: 2002-01-23 11:23

文章 ETERNAL »

能說你的環境太強了嗎 :lol:

以前經驗
我的環境是CPU P3 800,RAM 1G,20G SCSI HD
MySQL中某一TABLE大約有350萬筆資料,光是只有select這一個TABLE資料就要花了幾秒鐘
flyinghail
星球公民
星球公民
文章: 48
註冊時間: 2004-02-10 02:37

文章 flyinghail »

這就是索引的作用咯~
EXPLAIN看select如果type是ALL,那肯定要ns,如果是range以上,特別是ref以上,一般只要0.00*s
jeswang.tw
星球普通子民
星球普通子民
文章: 19
註冊時間: 2006-07-31 13:02

文章 jeswang.tw »

請問第一篇提到的 " 只要把第一段拿掉 " ,是指把以下這段程式碼都不要用,刪除掉嗎? :?:

代碼: 選擇全部

// 
// All GLOBAL announcement data, this keeps GLOBAL announcements 
// on each viewforum page ... 
// 
$sql = "SELECT t.*, u.username, u.user_id, u2.username as user2, u2.user_id as id2, p.post_time, p.post_username 
   FROM " . TOPICS_TABLE . " t, " . USERS_TABLE . " u, " . POSTS_TABLE . " p, " . USERS_TABLE . " u2 
   WHERE t.topic_poster = u.user_id 
   AND p.post_id = t.topic_last_post_id 
   AND p.poster_id = u2.user_id 
   AND t.topic_type = " . POST_GLOBAL_ANNOUNCE . " 
   ORDER BY t.topic_last_post_id DESC "; 
if( !$result = $db->sql_query($sql) ) 
{ 
   message_die(GENERAL_ERROR, "Couldn't obtain topic information", "", __LINE__, __FILE__, $sql); 
} 

$topic_rowset = array(); 
$total_announcements = 0; 
while( $row = $db->sql_fetchrow($result) ) 
{ 
   $topic_rowset[] = $row; 
   $total_announcements++; 
} 

$db->sql_freeresult($result); 
// End add - Global announcement MOD 
阿維
竹貓忠實會員
竹貓忠實會員
文章: 868
註冊時間: 2003-02-23 13:36
來自: 台南市

文章 阿維 »

那是說已經安裝好的時候刪除掉
假如你是正在安裝就略過那段就行了 :-)
提供代客維護 phpBB 3.0.x 以及外掛/風格升級或安裝的服務,如需委託,請與我聯絡,謝謝! ;)
我的 Skype 帳號:gpxjordan
jeswang.tw
星球普通子民
星球普通子民
文章: 19
註冊時間: 2006-07-31 13:02

文章 jeswang.tw »

修正,我自己少打 BY 這個字。 :oops:
主題已鎖定

回到「外掛問題討論」