2011-05-23 40 views
1

我想我知道這個問題的答案,但希望對此有另一種意見。所以我繼承了一個電子郵件腳本,每次執行時都會發送X個郵件。目前,它由250選擇和1

SELECT emailid, emailTo 
FROM email 
ORDER BY 
    dateadded ASC, priority ASC, emailDomain.DESC 
LIMIT 250 

做的事情(IMO)以一種奇怪的方式,然後通過PHP循環運行這個由

SELECT subject, message, emailHeaders 
FROM email 
WHERE emailid = {$id} 

抓出內容的消息,標題是完整的電子郵件標頭(帶HTML),所以有相當多的內容,現在我認爲在初始選擇時選擇這個內容會更有效率,而不是單獨請求每個郵件250次。因此,改變主查詢

SELECT emailid, emailTo, subject, message, emailHeaders 
FROM email 
ORDER BY 
    dateadded ASC, priority ASC, emailDomain.DESC 
LIMIT 250 

對我來說,感覺更好,我已經運行查詢,這是不顯著比沒有所有的內容選擇慢,但它會更好,要求通過ID對應的內容(索引)250次?如果任何人有這個或意見的一些統計資料,我會很感激的意見。

感謝

回答

1

最好是在單個查詢中獲取所有數據。您不會在WHERE和ORDER BY子句中引用主題,消息或emailHeaders,因此數據未被處理。此外,它是更好地執行一個查詢,因爲:250

  • 可能鎖定問題選擇
  • 服務器必須花時間接收/分析/處理250個查詢,而不是一個
0

是否有情況下,當一小部分來自所有250個電子郵件發送?

我認爲這是最大的251個服務器命中可能有爭議的唯一情況。在休息時,您的建議看起來完全合法

+0

不,它總是發送它的限制,感謝輸入 – Catharsis 2011-05-23 14:08:44

1

數據庫使用文件來存儲信息。 大多數情況下發生的事情是,您的SQL客戶端創建一個到SQL服務器的連接,詢問事情(「請求」)。服務器執行查詢,讀取文件併發回相應的結果。然後,發出請求的應用程序(您的郵件應用程序)使用這些信息。

向數據庫管理系統發出最少的請求會更有效率。

獲取整個結果集,並在應用程序中遍歷它。 (這是foreach循環方便的地方。)