1 頁 (共 1 頁)

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

發表於 : 2005-09-23 11:19
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:

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

這種方法還有可能造成Global Announcement排在Announcement的後面...還得修改一下ORDER BY

發表於 : 2005-09-23 22:01
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有這麼差嗎 :?:

發表於 : 2005-09-23 22:46
ETERNAL
剛剛測試結果

有MySQL的OR有使用索引
測試結果如下圖所示\r
圖檔

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

發表於 : 2005-09-24 16:14
依夢兒
Queries 數有變少了一些,修改前 Queries 數為 24 ,修改後 Queries 數降為 20 。^^

發表於 : 2005-09-24 19:34
flyinghail
依夢兒 寫:Queries 數有變少了一些,修改前 Queries 數為 24 ,修改後 Queries 數降為 20 。^^
- -b不會減少那麽多啦...應該只減少一次才對,還有三次是更新seesion的,如果有一段時間沒有刷新頁面就會多出來

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

人數越多,壓力會越大

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

人數越多,壓力會越大
5分鐘大概100人左右 :roll:
估計就算減少0.00*s實際輸出的時候也誤差掉了...

發表於 : 2005-09-25 09:17
ETERNAL
能說你的環境太強了嗎 :lol:

以前經驗
我的環境是CPU P3 800,RAM 1G,20G SCSI HD
MySQL中某一TABLE大約有350萬筆資料,光是只有select這一個TABLE資料就要花了幾秒鐘

發表於 : 2005-09-25 12:14
flyinghail
這就是索引的作用咯~
EXPLAIN看select如果type是ALL,那肯定要ns,如果是range以上,特別是ref以上,一般只要0.00*s

發表於 : 2006-08-25 20:38
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 

發表於 : 2006-08-26 00:42
阿維
那是說已經安裝好的時候刪除掉
假如你是正在安裝就略過那段就行了 :-)

發表於 : 2006-08-26 09:04
jeswang.tw
修正,我自己少打 BY 這個字。 :oops: