2012-06-16 53 views
3

我正在私人托兒中心爲一小羣父母建立一個網站。該網站所需的功能之一是有一個日曆,您可以選擇您可以負責清理地區的日期。現在,我已經制定了工作日曆。我在網上發現了一個簡單的腳本,我修改了適合我們用途的腳本。從技術上講,它運行良好,但我開始懷疑我是否應該改變從數據庫中提取信息的方式。頁面加載時SQL調用太多?

日曆每月呈現,並使用for-loop繪製爲表格。這意味着所述for循環每次頁面加載時運行28-31次,具體取決於月份。爲了介紹每天負責清理的人員,我添加了一個調用MySQL數據庫的地方,每個成員的清理日期都存儲在該數據庫中。僞代碼如下所示,簡化:

Draw table month 
    for day=start_of_month to day=end_ofmonth 
     type day 
     select member from cleaning_schedule where picked_day=day 
     type member 

這意味着頁面的每個重載做至少28 SELECT調用數據庫,對我來說顯得既效率低下,人們可能容易受到一個DDOS-攻擊。是否有更有效的方式獲得相同的結果?那裏有更復雜的預訂日曆,他們如何處理它?

回答

5
SELECT picked_day, member FROM cleaning_schedule WHERE picked_day BETWEEN '2012-05-01' AND '2012-05-31' ORDER BY picked_day ASC 

您可以通過查詢的結果循環,每一行都會有個約會,並從您選擇範圍內的人,按升序日期順序。

2

MySQL查詢緩存將保存您的培根。

簡版:如果您經常重複相同的SQL查詢,那麼只要基礎表沒有更改,它就會最終在沒有表訪問的情況下提供服務。所以:一個月的第一個電話將是ca. 35 SQL查詢,這是很多但不是太多。同一頁面的第二次加載將從緩存中快速返回結果。

我的經驗表明,這往往比創建奇特的連接查詢快得多,即使這可能。

+0

但是,如果緩存是爲了說,六月,然後我改變到七月,它必須做整個shebang,但我得到你的漂移。 – Sandokan

+0

在查詢緩存中可能有多個(實際上:很多)查詢 - 請參閱MySQL文檔..哦,現在它們已經停止了! –

+0

依靠MySQL來緩存你的數據通常不是一個好的做法。 –

1

您可以在SQL中使用更大和更小的值。因此,而不是在做每天一個選擇,你可以寫一個選擇整月:

SELECT day, member FROM cleaning_schedule 
WHERE day >= :first_day_of_month AND day >= :last_day_of_month 
ORDER BY day; 

然後,你需要在你的程序來處理每天多個成員關注。雖然程序邏輯會稍微複雜一些,但程序會更快:進程間甚至基於網絡的通信比其他邏輯慢得多。

根據數據結構,下面的語句可能可以更方便:

SELECT day, group_concat(member) FROM cleaning_schedule 
WHERE day >= :first_day_of_month AND day >= :last_day_of_month 
GROUP BY day 
ORDER BY day; 
+0

爲了讓您的第二個示例能夠工作,您需要在查詢中顯式使用GROUP BY日,否則它會將所有結果排成一行,並且有很多成員 –

1

28查詢心不是一個巨大的問題,很常見的大多數商業網站,但建議只是每個抓住你的月度數據一個月的時間。然後每天循環播放記錄。

2

不是說28個電話是一個大問題,但我會在整個月的數據中使用加入和呼叫。然後,您可以像遍歷數組一樣遍歷MySQL Query結果。